具有嵌套列表的元组到字典中

时间:2015-08-02 22:56:18

标签: python

假设我有这个元组:

k=('a', ['email1', 'email2']), ('b',['email3'])

当我这样做时:

j=dict(k)

它应该根据python文档返回:

{'a': ['email1', 'email2'], 'b': ['email3']}

当元组位于键值对中时,这很容易。但如果相反它只是一个元组呢? (以下示例):

   k=('a', ['email1', 'email2'], 'b',['email3'])

我试着这样做:

dict((k,))

但是如果元组中有多个元素,它就不起作用。

修改

  1. 有办法吗?
  2. dict((k,))dict[k]?之间的区别是什么它们似乎给出相同的输出。

4 个答案:

答案 0 :(得分:2)

这与How do you split a list into evenly sized chunks in Python?实际上是同一个问题,除非您想将其分组为2。给出:

def chunk(input, size):
    return map(None, *([iter(input)] * size))

你会这样做:

 k=('a', ['email1', 'email2'], 'b',['email3'])
 dict(chunk(k, 2))

<强>输出:

{'a': ['email1', 'email2'], 'b': ['email3']}

对于您的其他问题,您使用的是python3吗? dict[k]可能会__getitem__,但我不熟悉python3。 dict((k,))正在击中构造函数。在python2.7中,它们绝对不相同:

>>> dict((k,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 4; 2 is required
>>> dict[k]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'type' object has no attribute '__getitem__'

答案 1 :(得分:1)

您不能将列表作为字典键。字典键可以是immutable类型,请参阅https://docs.python.org/2/tutorial/datastructures.html#dictionaries

通过将一个带有列表的元组作为一些键,如示例所示,它将失败。

此外,您的元组示例仅在元组具有两个元素时才起作用,因此一个可以成为键,另一个可以成为值。我用这个例子:

k=('a', ['email1', 'email2']), ('b',['email3']), ('c',['email4'], 'a')

因为最后一个元组有3个项目,所以它会失败。你的第二个例子是一个超过2个元素的元组,因此无法转换。

我觉得您正在尝试将dict函数扩展到它的意图,如果您想要自定义构建字典,查找dict函数,查找字典理解或使用for循环添加元素。

http://legacy.python.org/dev/peps/pep-0274/&lt; - dictionary comprehensions

除了简单的元组到字典转换之外,你不太清楚你要做什么。

答案 2 :(得分:1)

您可以执行以下操作:

k=('a', ['email1', 'email2'], 'b',['email3'])
l = [(k[i], k[i+1]) for i in range(0, len(k), 2)]
l = dict(l)

print l

<强>输出:

{'a': ['email1', 'email2'], 'b': ['email3']}

答案 3 :(得分:1)

您可以使用dict对(长度为2个元组)初始化list,这就是为什么它适用于这种情况:

k=('a', ['email1', 'email2']), ('b',['email3'])
dict(k)     # key: a, b
            # value: ['email1', 'email2'], ['email3']

dict的构造函数将每个tuple中的第一个元素作为键,将第二个元素作为值。

在第二种情况下,您传递的是一个tuple,其中包含四个元素,dict没有启发式来区分“关键字”。和&#39;价值&#39;。因此,您需要按照@Kit Sunde的答案来分割您的元组。