在Python dict中迭代可变大小的列表

时间:2016-06-15 19:21:00

标签: python dictionary

我有一个如下所示的词典:

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 herehere上看到了几个帖子。但是我想知道是否有更快的方法可以做到这一点,而不必使用两个for循环?

3 个答案:

答案 0 :(得分:2)

你可以说

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

但是在循环问题中,这并没有真正回答你的循环。在给定包含列表的字典的情况下,嵌套迭代不会成为解决方案。

答案 1 :(得分:2)

这是一个for循环的解决方案。

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

答案 2 :(得分:1)

您可以从字典中获取值,并从子列表中获取值,无需键或索引:

for sublist in myDict.values():
    for value in sublist:
        print(value)