【问题标题】:Convert list to python dictionary according to its position in list根据列表在列表中的位置将列表转换为python字典
【发布时间】:2016-01-20 09:09:24
【问题描述】:

我有一个这样的列表:

c = ['A','B','C']

我希望它把它转换成dict 对象,比如

d = {"alphabets":{"0":"A","1":"B","2":"C"}}

我目前已经实现了以下代码:

c = ["A","B","C"]
d={}
for i in range(len(c)):
    d.update({"alphabets":{str(i): c[i]}})
print d

但这给出了输出{'alphabets': {'2': 'C'}}。有人知道如何处理这个错误吗?

【问题讨论】:

  • 你想要上面发布的订单,即0,1,2,3 - 那么头脑字典不关心订单
  • 请问你为什么要那个?事实上,我认为没有任何意义。
  • @TigerhawkT3 我也在问自己,为什么要创建一个以整数作为键的字典,就像在这个例子中一样。拥有一个列表要简单得多,并且仍然可以通过索引访问列表项:my_list[0]my_dict['0'] 更易于管理。
  • @abhi1610 它们已经排列在列表中,您可以通过索引访问每个项目。您可以将列表作为键 alphabets 的值。列表不能是字典中的键,这一点很重要。你可以有d = {'alphabets': ['A', 'B', 'C']}。有了一个列表,你就有更多的可能性,例如切片:d['alphabets'][::-1] 用于反转。
  • “我想将列表中的项目按照它们作为字典中的键的位置排列”是对您正在做的事情的重复,而不是您为什么要这样做的原因。如果您仍在使用那种“索引”作为键,那么在 list 中向它们添加属性就像在字典中一样容易。您可以通过mylist[key]已经访问它们。 这里没有区别或改进

标签: python list dictionary iteration


【解决方案1】:

那是因为你正在更新字典。

警告:

我用的是普通字典。其中没有订单,如果需要,您可以使用有序字典。

代码:

c = ["A","B","C"]
d={"alphabets":{}}
for i,v in enumerate(c):
    d["alphabets"][str(i)]=v
print d

输出:

{'alphabets': {'1': 'B', '0': 'A', '2': 'C'}}

注意事项:

  • 您的程序中的问题是您总是将键 alphabets 更新为新字典。
  • 这就是你得到c:2的原因,因为那是最后一次更新的字典 - 我所做的是创建了一个带有键 alphabets 的字典

【讨论】:

  • @abhi1610 很乐意为您提供帮助。您也可以使用其他方法,使用更快但不整洁的 dict 理解。
  • @The6thSense dict理解更好,但您的答案对初学者来说更全面。所以,为了更好的演示,循环迭代是可以的。
【解决方案2】:

您可以使用dict comprehension

In [196]: {'alphabets': {str(i):v for i, v in enumerate(c)}}
Out[196]: {'alphabets': {'0': 'A', '1': 'B', '2': 'C'}}

如果您需要订单,您可以使用来自collectionsOrderedDict

from collections import OrderedDict
l1 = [(str(i),v) for i, v in enumerate(c)]
d2 = OrderedDict(l1)

In [284]: d2
Out[284]: OrderedDict([('0', 'A'), ('1', 'B'), ('2', 'C')])

d = {'alphabets': d2}

In [286]: d
Out[286]: {'alphabets': OrderedDict([('0', 'A'), ('1', 'B'), ('2', 'C')])}

或者@cezar 推荐的网友:

d = {'alphabets': OrderedDict([(str(i), v) for i, v in enumerate(c)])}

【讨论】:

  • @Anton Protopopov - 我可以问你一个问题,为什么The6thSense's 的答案不像你的那样维持秩序?
  • 更重要的是d['alphabets']OrderedDict,而不是d 本身。
  • 我认为这只是巧合,因为 dict 没有按顺序排列键
  • @cezar 是的,谢谢。这很奇怪,但OrderedDict 导致dict 我得到OrderedDict([('0', 'A'), ('2', 'C'), ('1', 'B')]) 我认为应该是:OrderedDict([('0', 'A'), ('1', 'B'), ('2', 'C')])
  • oneliner 可以通过简单的列表理解来制作:d = {'alphabets': OrderedDict([(str(i), v) for i, v in enumerate(c)])}。这种方式应该从一开始就进行排序。
【解决方案3】:

你也可以使用zip,虽然它不维护order

>>>{'alphabets':{k:v for k,v in zip(range(len(c)),c)}}
>>>{'alphabets': {0: 'A', 1: 'B', 2: 'C'}}

【讨论】:

  • 你可以使用 enumerate 然后 zip 和 range。
  • @The6thSense 是的!当然-更像Anton Protopopov
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 2019-02-10
  • 2011-11-18
  • 2022-08-16
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多