我是Python的新手,需要将一个列表转换成字典。我知道我们可以将元组列表转换为字典。
这是输入的列表:
L = [1,term1, 3, term2, x, term3,... z, termN]
我想将这个列表转换为一个元组列表(或直接转换成字典),如下所示:
[(1, term1), (3, term2), (x, term3), ...(z, termN)]
我们如何在Python中轻松地实现这一点?
>>> L = [1, "term1", 3, "term2", 4, "term3", 5, "termN"]
# Create an iterator
>>> it = iter(L)
# zip the iterator with itself
>>> zip(it, it)
[(1, 'term1'), (3, 'term2'), (4, 'term3'), (5, 'termN')]
您想每次分组三个项目吗?
>>> zip(it, it, it)
你想将N个项目分成一组吗?
# Create N copies of the same iterator
it = [iter(L)] * N
# Unpack the copies of the iterator, and pass them as parameters to zip
>>> zip(*it)
zip
是做什么的吗?我以为我知道它的工作原理,但显然不是,因为它没有给出 [(1,1,1),('term1','term1','term1'),...]
。 - user1717828zip(iter(L), iter(L), iter(L))
,它就会执行此操作,但通过分解iter的创建并共享它,您可以获得这种行为。 - Flexozip
对象放入一个list
中,例如:list(zip(it,it))
,因为Python3不会评估zip
,除非你明确要求它 - 请参见https://dev59.com/ZWIj5IYBdhLWcg3w6I89#19777642。 - Manizip
内部/隐式地将 list
转换为 iter
并在其上使用 next
? - Давид Шико尝试使用组聚类习语:
zip(*[iter(L)]*2)
* 2
来制作两个副本。我也可以写成zip(*(iter(L),) * 2)
。 - Grijesh Chauhanzip
将连续的偶数和奇数元素直接配对,以字典形式列出:m = [ 1, 2, 3, 4, 5, 6, 7, 8 ]
d = { x : y for x, y in zip(m[::2], m[1::2]) }
或者,既然您熟悉元组 -> 字典的转换方向:
d = dict(t for t in zip(m[::2], m[1::2]))
甚至:
d = dict(zip(m[::2], m[1::2]))
使用切片吗?
L = [1, "term1", 2, "term2", 3, "term3"]
L = zip(L[::2], L[1::2])
print L
>>> L = [1, "term1", 3, "term2", 4, "term3", 5, "termN"]
>>> it = iter(L)
>>> [(x, next(it)) for x in it ]
[(1, 'term1'), (3, 'term2'), (4, 'term3'), (5, 'termN')]
>>>
>>> L = [1, "term1", 3, "term2", 4, "term3", 5, "termN"]
>>> [i for i in zip(*[iter(L)]*2)]
[(1, 'term1'), (3, 'term2'), (4, 'term3'), (5, 'termN')]
>>> L = [1, "term1", 3, "term2", 4, "term3", 5, "termN"]
>>> map(None,*[iter(L)]*2)
[(1, 'term1'), (3, 'term2'), (4, 'term3'), (5, 'termN')]
>>>
[(L[i], L[i+1]) for i in xrange(0, len(L), 2)]
L
,根据你的问题,我认为你应该使用偶数长度的L
。这将在Python2.X中起作用,在Python3.x中,你应该使用range而不是xrange。 - Grijesh Chauhan[set(L[i:i+2]) for i in range(0, len(L),2)]
dict(zip(*[iter(L)]*2))
。 - Grijesh Chauhan