Dear friends,

it is very hard for me to understand iterators. Can you please help?

I am trying to solve “say” exercise.

Suppose I have this simple code lines:

```
num_list = [999, 999, 999, 999]
order = ["", "thousand", "million", "billion"]
result_dict = {n: o for n, o in zip(num_list, order) if n > 0}
print(result_dict)
```

The result is:

{999: ‘billion’}

I can’t understand why result_dict only gets the last k and v from zip iterator. I expected result_dict would include all k and v from zip iterator.

Can you please help me on this?

Thanks,

Rod.

1 Like

It doesn’t; it gets all of them. However, `num_list`

contains only `999`

s. As a result, the dict receives the same key four times. The first time an entry (`999: ""`

) is added, but the next three times the value is overwritten. The last value to be written is `"billion"`

, hence your result.

Try `num_list [0, 1, 2, 3]`

for contrast.

1 Like

As @MatthijsBlom has indirectly pointed out, keys in dictionaries have to be *unique*. With the way your comprehension is written, you have the key portion mapped to `num_list`

items and the values mapped to `order`

items. Since you number list had identical values, they are all getting written as the **same key**. Flipping keys & values in the comprehension will get you a different result:

```
num_list = [999, 999, 999, 999]
order = ["", "thousand", "million", "billion"]
result_dict = {word: number for number, word in
zip(num_list, order) if number > 0}
print(result_dict)
>>> {'': 999, 'thousand': 999, 'million': 999, 'billion': 999}
```

Conversely, you can flip the order in the `zip()`

:

```
num_list = [999, 999, 999, 999]
order = ["", "thousand", "million", "billion"]
result_dict = {word: number for word, number in
zip(order, num_list) if number > 0}
print(result_dict)
>>>> {'': 999, 'thousand': 999, 'million': 999, 'billion': 999}
```

Thank you! Now I understand!

I will try to do that.

Thank you so much,

Rod.