2016-06-15 3 views
0

у меня есть Dict, который выглядит следующим образом:Перебор переменных размеров списков в Python Dict

myDict = {'a':['1','2','3'],'b':['1','2'],'c':['1','2','3','4']} 

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

for i in myDict.iterkeys(): 
    for j in range(0,len(myDict[i])): 
     print myDict[i][j] 

Я видел пару сообщений в stackoverflow here и here. но мне интересно, есть ли более быстрый способ сделать это, не используя два для циклов?

+0

Не совсем. Вы хотите перебирать значения (каждый список), а затем каждый член данного списка, поэтому вам нужно иметь две петли в самом общем смысле. Вероятно, есть некоторые оптимизации в зависимости от того, что вы пытаетесь сделать. (Например, 'для lst в myDict.values ​​(): для значения в lst: print value') –

+2

только потому, что имеют 2 вложенных цикла, которые автоматически не означают, что код медленный – RomCoo

ответ

2

Вот решение с одной для цикла.

for i in reduce(lambda x, y: x+y, myDict.values()): 
    print i 

myDict.values это список.

In [33]: myDict.values() 
Out[33]: [['1', '2', '3'], ['1', '2', '3', '4'], ['1', '2']] 

С использованием reduce я сделал это как единый список.

In [34]: reduce(lambda x, y: x+y, myDict.values()) 
Out[34]: ['1', '2', '3', '1', '2', '3', '4', '1', '2'] 

И итерацию хотя

Редактировать

Что касается времени выполнения с использованием timeit

In [69]: def test1(): 
    for sublist in myDict.values(): 
      for value in sublist: 
        print(value) 
    ....:    
In [70]: def test2(): 
    for i in reduce(lambda x, y: x+y, myDict.values()): 
      print i 
    ....:   
In [71]: %timeit test1 
10000000 loops, best of 3: 27 ns per loop 
In [72]: %timeit test2 
10000000 loops, best of 3: 25.6 ns per loop 

Это работать лучше.

Выполните согласно timeit модуля

In [81]: timeit.timeit(test2, number=10000) 
Out[81]: 0.016376018524169922 
In [82]: timeit.timeit(test1, number=10000) 
Out[82]: 0.023879051208496094 
+0

спасибо Рахул .. это работает! – tkyass

+0

@tkyass Это может сработать, но его можно прочитать? Также эффективен ли он? Возможно, стоит выполнить некоторые тесты с помощью [** 'timeit' **] (https://docs.python.org/2/library/timeit.html). –

+0

@PeterWood Я обновил свой ответ, пожалуйста, проверьте. –

2

Вы можете просто сказать

for sub_list in myDict.values(): 
    for item in sub_list: 
     print(item) 

Но это на самом деле не ответить на ваш цикл в вопросе петли. Не будет решения для вложенной итерации с учетом словаря, содержащего списки.

+0

Здесь вы использовали 2 цикла. –

+0

Это странно! –

1

Вы можете просто получить значения из словаря, а значения от подсписка, нет необходимости ключа или индекса:

for sublist in myDict.values(): 
    for value in sublist: 
     print(value) 
Смежные вопросы