如何将字典转换为平面列表?

13

假设有一个 Python dict,例如:

{
  'a': 1,
  'b': 2,
  'c': 3
}

如何轻松地创建带有在同一行的键和值的平面列表?例如:

['a', 1, 'b', 2, 'c', 3]

(list(itertools.chain(*sorted(d.iteritems())))) - Padraic Cunningham
your_list = list(eval(your_dict.__str__().replace(':',','))) , or use a regex to replace ':' to ',' - L F
4个回答

15

由于你使用的是Python 2.7版本,我建议你使用dict.iteritems或者dict.viewitems以及列表推导式,像这样:

>>> [item for pair in d.iteritems() for item in pair]
['a', 1, 'c', 3, 'b', 2]
>>> [item for pair in d.viewitems() for item in pair]
['a', 1, 'c', 3, 'b', 2]

dict.iteritemsdict.viewitemsdict.items 更好,因为它们不会创建一个键值对列表。

如果您想知道如何编写可在 Python 3.x 中高效运行的可移植代码,则可以像这样迭代键:

>>> [item for k in d for item in (k, d[k])]
['a', 1, 'c', 3, 'b', 2]

7
In [39]: d = {                                   
  'a': 1,
  'b': 2,
  'c': 3
}

In [40]: list(itertools.chain.from_iterable(d.items()))
Out[40]: ['b', 2, 'a', 1, 'c', 3]

请注意,字典是无序的,这意味着您输入键的顺序并不总是它们存储的顺序。如果您想保留顺序,您可能正在寻找一个有序字典


4
非常惊人的是,它的速度与[item for pair in d.items() for item in pair]几乎没有差别:分别为1.05微秒和681纳秒。 - jfs
@J.F.Sebastian:我想我正在开始与函数式编程的秘密恋情。如此之秘密,以至于连我自己都不知道。 - inspectorG4dget
@J.F.Sebastian:如果使用更大的字典,时间差异会更加明显吗? - inspectorG4dget

1
您可以使用sum
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> sum(d.items(), tuple())
('a', 1, 'c', 3, 'b', 2)

聪明的做法: list(sum(d.items(), tuple())) 可以达到期望的结果。 - blah238
2
@blah238 如果你有一个大字典的话,我不会建议使用它,因为相比其他方法,它有点慢。有些人可能会认为它不符合Python的风格,但我喜欢它的函数式味道。 - jme
3
这样做非常低效,请尝试使用 d = {k:k for k in range(100000)},然后去泡杯茶。 - Padraic Cunningham
1
几乎每个在 Stack Overflow 上的问题都基于玩具示例,你试图用一个可扩展的高效解决方案来回答,这真的是一个糟糕的解决方案。而且,如果列表推导式相当难以理解,那我也不知道该怎么形容你的解决方案了。 - Padraic Cunningham
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jme
显示剩余2条评论

-2
res_list = []
for k, v in d:
    res_list.append(k).append(v)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接