假设我有一个python中的a列表,它的条目可以方便地映射到字典中。每个偶数元素表示字典的键,下面的奇数元素是值
例如,
a = ['hello','world','1','2']
我想把它转换成一本字典b,在那里
b['hello'] = 'world'
b['1'] = '2'
号
实现这一点的语法上最干净的方法是什么?
使用python从列表中生成字典的可能副本
b = dict(zip(a[::2], a[1::2]))
如果a是大的,那么您可能需要做如下的事情,而这并没有像上面那样列出任何临时列表。
from itertools import izip
i = iter(a)
b = dict(izip(i, i))
号
在python 3中,您也可以使用听写理解,但具有讽刺意味的是,我认为最简单的方法是使用range()和len(),这通常是一种代码味道。
b = {a[i]: a[i+1] for i in range(0, len(a), 2)}
因此,iter()/izip()方法可能仍然是python 3中最为常见的方法,尽管正如eol在评论中指出的那样,zip()在python3中已经很懒惰了,所以您不需要izip()。
i = iter(a)
b = dict(zip(i, i))
。
如果你想把它放在一行上,你就必须作弊并用分号。-)
…或者在python 3中简单地说是zip(i, i),因为zip()现在返回一个迭代器。
注意,python 2.7.3也有听写理解
简单的答案
另一个选项(Alex Martelli提供https://stackoverflow.com/a/2597178/104264):
dict(x[i:i+2] for i in range(0, len(x), 2))
。相关说明
如果你有这个:
a = ['bi','double','duo','two']
。
您需要这样做(列表中的每个元素键入一个给定值(在本例中为2)):
{'bi':2,'double':2,'duo':2,'two':2}
您可以使用:
>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
。
这是专为python 3设计的吗?
适用于python 2.4。谢谢。
使用fromkeys。埃多克斯1〔10〕
这是在做一些事情,而不是在问问题。
您可以很容易地使用听写理解:
a = ['hello','world','1','2']
my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}
。
这相当于下面的for循环:
my_dict = {}
for index, item in enumerate(a):
if index % 2 == 0:
my_dict[item] = a[index+1]
号
我觉得很酷,如果你的列表只有两个项目:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
号
记住,dict接受任何包含iterable的iterable,其中iterable中的每个项本身必须是一个iterable,并且只有两个对象。
快速而简单的一个,如果列表包含两个以上的项,只需添加,然后使用dict(ls)而不是dict([ls])。例如,如果ls=['a'、'b'、'c'、'd']则为dict(ls)
不错,而且很光滑。"iterable中的每个项本身必须是具有两个对象的iterable。'是这里的关键事实。
您可以在不创建额外数组的情况下非常快速地执行此操作,因此即使对于非常大的数组,也可以执行此操作:
dict(izip(*([iter(a)]*2)))
号
如果你有一个发电机a,甚至更好:
dict(izip(*([a]*2)))
号
下面是详细的介绍:
iter(h) #create an iterator from the array, no copies here
[]*2 #creates an array with two copies of the same iterator, the trick
izip(*()) #consumes the two iterators creating a tuple
dict() #puts the tuples into key,value of the dictionary
号
这将生成具有相同键和值对的字典({'hello':'hello','world':'world','1':'1','2':'2'})
不,一切都很好。请仔细阅读。它说:"如果你有一个发电机A……",如果你没有发电机,就用第一条线。第二种方法是一种替代方法,如果您有一个生成器而不是一个列表,这是非常有用的,因为大多数情况下都是这样。
你说得对,对不起
可能不是最凶猛的Python,但是
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
了解enumerate
枚举不允许指定步骤大小,但可以使用for i, key in enumerate(a[::2]):。由于dict构造器可以为您完成大部分工作,所以仍然是不完整的。
@辛格布尔:非常感谢你开阔了我的视野!我以后一定会尽可能多地把它合并起来!
@格尼布尔:你能再多解释一点关于for i, key in enumerate(a[::2]):方法的工作原理吗?生成的成对值将是0 hello和1 1,我不清楚如何使用它们来生成{'hello':'world', '1':'2'}。
@马蒂诺,你说得对。我想我的意思一定是enumerate(a)[::2]。
对于这个转换,我也非常感兴趣有一个一行程序,因为这样的列表是Perl中散列的默认初始值设定项。
这条线索给出了非常全面的答案。-
python将列表转换为字典
小精灵
我的一个我是Python的新手),使用Python2.7生成器表达式,将是:
埃多克斯1〔6〕
您也可以这样做(在这里进行字符串到列表的转换,然后转换为字典)
string_list ="""
Hello World
Goodbye Night
Great Day
Final Sunset
""".split()
string_list = dict(zip(string_list[::2],string_list[1::2]))
print string_list
号
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}
result : {'hello': 'world', '1': '2'}
。
您也可以尝试这种方法,将键和值保存在不同的列表中,然后使用dict方法
data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']
keys=[]
values=[]
for i,j in enumerate(data):
if i%2==0:
keys.append(j)
else:
values.append(j)
print(dict(zip(keys,values)))
号
输出:
{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
尝试以下代码:
>>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
>>> d2
{'three': 3, 'two': 2, 'one': 1}
号
我不确定这是不是Python,但似乎管用
def alternate_list(a):
return a[::2], a[1::2]
key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))
这是已接受答案的副本。
#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
b[v] = c
c+=1
print b
号
`
这不是问题所要求的。