将Python字典转换为List

Fed*_*rer 180 python dictionary list

可能重复:
如何将Python字典转换为元组列表?

我正在尝试将Python字典转换为Python列表,以便执行一些计算.

#My dictionary
dict = {}
dict['Capital']="London"
dict['Food']="Fish&Chips"
dict['2012']="Olympics"

#lists
temp = []
dictList = []

#My attempt:
for key, value in dict.iteritems():
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp) 
    aKey = ""
    aValue = ""
Run Code Online (Sandbox Code Playgroud)

这是我的尝试......但我无法弄清楚什么是错的?

Bjö*_*örn 396

dict.items()
Run Code Online (Sandbox Code Playgroud)

诀窍.

  • 对于python3,使用`list(dict.values())` (24认同)
  • 他想要一个平面列表,items()产生一个元组列表. (20认同)
  • 要获得一个平面列表,请改用dict.values(). (20认同)
  • @shylent我认为他的意思是非常明显/容易/ pythonic (14认同)
  • 我知道有一些荒谬的Pythonic方式,非常感谢你.我发现Python的文档很难阅读! (13认同)
  • 当我尝试访问由dictlist = dict.items()生成的列表时,出现错误,试图像列表一样访问它:dictlist [i] [1]。Python3 doc说:~~~~“ dict.keys(),dict.values()和dict.items()返回的对象是视图对象。它们提供字典条目的动态视图,这意味着当字典变化,则视图反映了这些变化。” ~~~~还需要执行一个步骤才能使其起作用:---- [为dict.items()中的项目提供[(item [0],item [1])] (4认同)

Aks*_*lén 177

在Python中,可以轻松地从dict转换为list.三个例子:

>> d = {'a': 'Arthur', 'b': 'Belling'}

>> d.items()
[('a', 'Arthur'), ('b', 'Belling')]

>> d.keys()
['a', 'b']

>> d.values()
['Arthur', 'Belling']
Run Code Online (Sandbox Code Playgroud)

  • 看来在Python3中,必须使用list(d.items())、list(d.keys())和list(d.values()) (6认同)
  • @MichaelScheper [未指定标准dict的顺序](http://stackoverflow.com/a/9001529/638546),值的顺序可以与插入顺序不同.但是,可以[对上面的列表进行排序](https://wiki.python.org/moin/HowTo/Sorting)或使用**OrderedDict**(请参阅第一个链接). (2认同)

Dav*_*ebb 135

你的问题是你有keyvalue引号使它们成为字符串,即你设置aKey包含字符串"key"而不是变量的值key.此外,您没有清除temp列表,因此您每次都要添加它,而不是只有两个项目.

要修复代码,请尝试以下操作:

for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Run Code Online (Sandbox Code Playgroud)

你并不需要将循环变量拷贝key,并value在使用前到另一个变量所以我放弃了出来.类似地,您不需要使用append来构建列表,您可以在方括号之间指定它,如上所示.我们可以做的dictlist.append([key,value]),如果我们想尽可能简短.

或者只是dict.items()按照建议使用.

  • 它说''dict'对象没有属性'iteritems'.请你更新python 3.6的答案. (4认同)
  • `dict(iterable) -> new` 字典初始化如下: `d = {} for k, v in iterable: d[k] = v` 所以请使用 `items()` 而不是 `'iteritems'` (4认同)
  • 由于解释我做错了什么,所以答案正确.正如您所知,我对Python非常了解,并且非常感谢任何解释.干杯! (3认同)
  • 如果您使用这样的附加列表,则表示您正在生成列表列表.他想要的是一个平面列表,你可以像Shay的回答一样使用extend(). (2认同)
  • 他从未说过,Ajith.列表列表是一个有效的python列表,并且比仅包含非列表值的平面列表更好地解释"字典".列表列表至少能够显示仍然组合在一起的键和值. (2认同)

Sha*_*hay 53

你应该用dict.items().

以下是针对您的问题的单线解决方案:

[(k,v) for k,v in dict.items()]
Run Code Online (Sandbox Code Playgroud)

结果:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')]
Run Code Online (Sandbox Code Playgroud)

或者你可以做

l=[]
[l.extend([k,v]) for k,v in dict.items()]
Run Code Online (Sandbox Code Playgroud)

对于:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London']
Run Code Online (Sandbox Code Playgroud)

  • 或只是`list(dict.items())` (3认同)
  • 至少在python 2.6中,你不需要dict.items():`[(k,v)代表k,v代表dict]`. (2认同)
  • Python3.6 - `[x for d in dict.items()]`做同样的事情. (2认同)

Mar*_*llo 33

 >>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'}
 >>> list(reduce(lambda x, y: x + y, a.items()))
 ['foo', 'bar', 'baz', 'quux', 'hello', 'world']
Run Code Online (Sandbox Code Playgroud)

解释一下:a.items()返回一个元组列表.将两个元组一起添加使得一个元组包含所有元素.因此,缩减创建一个包含所有键和值的元组,然后列表(...)从中生成一个列表.

  • 对于python 3. ^而不是使用reduce,请使用functools.reduce (4认同)

sth*_*sth 21

可能你只想要这个:

dictList = dict.items()
Run Code Online (Sandbox Code Playgroud)

你的方法有两个问题.对于一个使用keyvalue引号,这是用字母"关键"和"价值",不涉及名称的变量字符串.此外,您继续向"临时"列表添加元素,并且永远不会删除之前迭代中已存在的旧元素.确保temp每次迭代都有一个新的空列表并使用keyvalue变量:

for key, value in dict.iteritems():
    temp = []
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果没有临时变量,这可以写得更短,items()而不是iteritems()在Python 3中:

for key, value in dict.items():
    dictList.append([key, value])
Run Code Online (Sandbox Code Playgroud)


Mor*_*gan 5

如果你只是制作一个字典来制作一个元组列表,因为创建像你这样的字母可能会很痛苦,你可能会考虑使用zip()

如果你有一个标题和多行,它特别有用.例如,如果我假设你想要国家的奥运会统计数据:

headers = ['Capital', 'Food', 'Year']
countries = [
    ['London', 'Fish & Chips', '2012'],
    ['Beijing', 'Noodles', '2008'],
]

for olympics in countries:
    print zip(headers, olympics)
Run Code Online (Sandbox Code Playgroud)

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')]
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')]
Run Code Online (Sandbox Code Playgroud)

不知道这是不是最终目标,也不是我的主题,但这可能是要记住的事情.