2016-09-20 2 views
1

Я хочу напечатать все уникальные комбинации ключей и значений для этого словаря:словарь Комбинации - Неравный Количество клавиш и значения

items = {'a':[10,100,1000],'b':[11,110],'c':[12,120]} 

Используя код,

for key, value in items.items(): 
    print(key,value) 

я получаю следующий результат :

b [11, 110] 
c [12, 120] 
a [10, 100, 1000] 

Я хотел бы привести следующий результат, указанный в словаре:

b 11 
b 110 
c 12 
c 120 
a 10 
a 100 
a 1000 

Порядок комбинаций значений ключа не важен, но результат должен сохранять связь. Как всегда, любые рекомендуемые ресурсы и/или условия поиска, связанные с этой проблемой, будут оценены.

ответ

1

Вы были очень близки:

items = {'a':[10,100,1000],'b':[11,110],'c':[12,120]} 

# iterate on key/items couple 
for k,vl in items.items(): 
    # iterate on all values of the list 
    for v in vl: 
     # print with a simple format 
     print("{} {}".format(k,v)) 

выход:

a 10 
a 100 
a 1000 
c 12 
c 120 
b 11 
b 110 

Обратите внимание, что вы можете использовать for k,vl in sorted(items.items()): для печати ключей в отсортированном порядке (a,b,c), то же самое для внутреннего списка:

# iterate on key/items couple 
for k,vl in sorted(items.items()): 
    # iterate on all values of the list 
    for v in sorted(vl): 
     # print with a simple format 
     print("{} {}".format(k,v)) 

мощность:

a 10 
a 100 
a 1000 
b 11 
b 110 
c 12 
c 120 
+0

Благодарим вас, @ Jean-Francois. Я хочу узнать больше об этой технике, рассмотрите ли вы это вложенный цикл? (Я буду принимать ответ как ответ как можно скорее). – Daniel

+0

Вложенный цикл for представляет собой цикл for внутри цикла for. Это соответствует. –

1

Использование itertools.chain.from_iterables и list comprehension, вы можете "сплющить" это список кортежей:

In [27]: import itertools 

In [28]: list(itertools.chain.from_iterable([[(item_[0], v) for v in item_[1]] for item_ in items.items()])) 
Out[28]: 
[('a', 10), 
('a', 100), 
('a', 1000), 
('c', 12), 
('c', 120), 
('b', 11), 
('b', 110)] 

Из этого легко сделать все, что вы хотите, как печать его:

In [29]: for k, v in itertools.chain.from_iterable([[(item_[0], v)  for v in item_[1]] for item_ in items.items()]): 
    ....:  print k, v 
    ....:  
a 10 
a 100 
a 1000 
c 12 
c 120 
b 11 
b 110 
2

Или просто:

items = {'a':[10,100,1000],'b':[11,110],'c':[12,120]} 

for key, value in items.items(): 
    for v in value : 
     print(key,v) 
Смежные вопросы