Home > other >  Iterate between two python dictionaries and be able to "increment" to the next string inde
Iterate between two python dictionaries and be able to "increment" to the next string inde

Time:03-27

Trying to learn python so I don't even know if there's a feature for this. but lets say I have the following two dictionaries

dict1 = {
   'key1': 1
   'key2': 2
   'key3': 3
}

dict2 = {
   'key1': 0
   'key2': 2
   'key3': 4
}

Now I want to iterate between the two dictionaries but if one of the keys' value is 0, I want the other dictionary to move to the next string index. You can assume both dictionaries have the same number of keys and key names.

Basically I want something like this:

for someKey, anotherKey in dict1, dict2:
   if dict1[someKey] == 0:
        #Move someKey to the next string index
        #In other words move someKey from 'key1' -> 'key2' (On loop 0)
   if dict2[anotherKey] == 0:
        #Move anotherKey to the next string index
        #In other words move someKey from 'key1' -> 'key2' (On loop 0)

Was looking into zip, but I don't think it solves the problem of maintaining separate string indices

So example output would be like:

(loop 1)
1 == 0? no 
0 == 0? yes
   Now only move anotherKey from 'key1' to 'key2'

(loop 2)
1 == 0? no
2 == 0? no

Now here it would infinitely loop here, but I have some code 
that does some dice rolling and decrements one of the 
values so it guarantees one number will eventually be 0. 
Just keep that in mind. 

CodePudding user response:

I don't believe there is a "pythonistic" way to solve it. Instead, you can try an approach more "algorithmic" using while:

keys1 = list(dict1.keys())
keys2 = list(dict2.keys())
i = j = 0

while i < len(keys1) and j < len(keys2):      
   if dict1[keys1[i]] == 0:
        i  = 1
   if dict2[keys2[j]] == 0:
        j  = 1

I think may be there is another solution but this is practical.

CodePudding user response:

One way to do this is using iterators. See iter() and next(), both Python built-in functions documented here and here for some background.

dict1 = {
   'key1': 1,
   'key2': 2,
   'key3': 3
}

dict2 = {
   'key1': 0,
   'key2': 2,
   'key3': 4
}

it1 = iter(dict1)
it2 = iter(dict2)
v1 = next(it1, None)
v2 = next(it2, None)
count = 0
while v1 is not None or v2 is not None:
    print(f"v1, dict1[v1] {v1, dict1[v1] if v1 is not None else 'na'}, v2, dict2[v2] {v2, dict2[v2] if v2 is not None else 'na'}")
    if v1 is not None and dict1[v1] == 0:
        v1 = next(it1, None)
    if v2 is not None and dict2[v2] == 0:
        v2 = next(it2, None)
    # simulate dice rolling and decrement mentioned in the question
    count  = 1
    if count == 3:
        dict1['key1'] = 0
    elif count == 6:
        dict2['key2'] = 0
    elif count == 9:
        dict1['key2'] = 0
        dict2['key3'] = 0
    elif count == 12:
        dict1['key3'] = 0
print(f"v1, dict1[v1] {v1, dict1[v1] if v1 is not None else 'na'}, v2, dict2[v2] {v2, dict2[v2] if v2 is not None else 'na'}")

Output:

v1, dict1[v1] ('key1', 1), v2, dict2[v2] ('key1', 0)
v1, dict1[v1] ('key1', 1), v2, dict2[v2] ('key2', 2)
v1, dict1[v1] ('key1', 1), v2, dict2[v2] ('key2', 2)
v1, dict1[v1] ('key1', 0), v2, dict2[v2] ('key2', 2)
v1, dict1[v1] ('key2', 2), v2, dict2[v2] ('key2', 2)
v1, dict1[v1] ('key2', 2), v2, dict2[v2] ('key2', 2)
v1, dict1[v1] ('key2', 2), v2, dict2[v2] ('key2', 0)
v1, dict1[v1] ('key2', 2), v2, dict2[v2] ('key3', 4)
v1, dict1[v1] ('key2', 2), v2, dict2[v2] ('key3', 4)
v1, dict1[v1] ('key2', 0), v2, dict2[v2] ('key3', 0)
v1, dict1[v1] ('key3', 3), v2, dict2[v2] (None, 'na')
v1, dict1[v1] ('key3', 3), v2, dict2[v2] (None, 'na')
v1, dict1[v1] ('key3', 0), v2, dict2[v2] (None, 'na')
v1, dict1[v1] (None, 'na'), v2, dict2[v2] (None, 'na')
  • Related