python - 遍历字典中的列表元素

标签 python list dictionary

我有一个字典 dict = {1:['cup','pen'],2:['one','two'],3:['five']}我必须先遍历所有 keys 的第一个元素,然后再遍历第二个元素。 我已经用下面的方式编写了,但是它的输出首先遍历列表 index 0,然后遍历 index 1。 谁帮我修改一下代码,让它可以遍历所有列表的第一个元素和第二个元素

dict = {1:['cup','pen'],2:['one','two'],3:['five']}
for v in dict.values():
  for i in range (len(v)):
    print v[i]

以上代码的输出:

cup
pen
one
two
five

但希望以下面的方式:

cup
one
five
pen
two

最佳答案

使用 zipped-transpose idiom , 用 itertools.zip_longest 压缩到最长列表.然后遍历子列表中的每个项目,过滤掉 None 值。

from itertools import zip_longest

for i in zip_longest(*data.values()):
    for j in filter(None, i):
        print(j)

cup
one
five
pen
two

这里,data 是您的输入字典。不要使用 dict 来命名变量,它会隐藏同名的内置类。

请注意,在 python-3.6 以下的 python 版本上不能保证此顺序,因为在这些旧版本的 python 中不对字典进行排序。

最后请注意,对于 python-2.x,要使用的适当函数是 itertools.izip_longest


zip_longest 的输出如下所示:

print(list(zip_longest(*data.values())))
[('cup', 'one', 'five'), ('pen', 'two', None)]

由于函数的“zip longest”行为,这些 None 值被插入以代替缺失值。这些 Nonefilter.


您可以使用 itertools.chainprint 语句来发挥创意,一行完成:

from itertools import chain
print(*filter(None, chain.from_iterable(zip_longest(*data.values()))), sep='\n')

cup
one
five
pen
two

重写得更清楚一点:

print(
   *filter(                                 # `filter` out None (iterable unpacking)       
        None, 
        chain.from_iterable(                # flatten an iterable of iterables
               zip_longest(*data.values())  # zip-longest transpose
       )
    ), 
    sep='\n'                                # separate unpacked arguments with newline
)

还有一个选项,用于提交作业,无需 zip_longest。这只是在键上循环,一次从每个列表中弹出一个元素。

while any(bool(v) for v in data.values()):
    for k in data:
        try:
            print(data[k].pop(0))
        except IndexError:
            pass

cup
one
five
pen
two

这会清空其内容的 data,因此您可能需要事先复制一份数据。

关于python - 遍历字典中的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366684/

相关文章:

python - 列表理解转换

python - 在 Python 中将日期时间列表转换为日期

c++ - 单链表和时间复杂度

python - 导入sklearn时出错

javascript - 使用 React 在每两个元素之后创建新的 ul

python - 从字典中减去元素

python - 如何干净地更新字典中的值?

python - 将元组作为值附加到字典中的现有键

python - 使用正则表达式转换列表

python - Ubuntu:selenium.common.exceptions: session 未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 79