【问题标题】:Create dictionary from points list and multiple attribute lists从点列表和多个属性列表创建字典
【发布时间】:2018-11-02 15:56:03
【问题描述】:

我想创建一个这种格式的字典:

mydic = {
    0: {'a': (20,10), 'b': 1, 'c': 0}, 
    1: {'a': (0,10), 'b': 1, 'c': 0}, 
    2: {'a': (4,5), 'b': 0, 'c': 0}, 
    3: {'a': (6,2), 'b': 0, 'c': 0}, 
    4: {'a': (1,4), 'b': 0, 'c': 1} 
}

给定四个列表:

node = [0,1,2,3,4]
a = [(20,10),(0,10),(4,5),(6,2),(1,4)]
b = [1,0,0,0,0]
c = [0,1,0,0,1]

感谢任何帮助!

【问题讨论】:

  • 为什么1 键与其他键不同?好像是凭空出现的。另外,您有任何尝试的解决方案吗?请发布您尝试过的代码。
  • 错字抱歉,已修复。

标签: python python-3.x list dictionary


【解决方案1】:

如果可迭代对象的长度都相同,您可以将zip()dict理解一起使用

items = node, a, b, c
result = {n: {'a': a_, 'b': b_, 'c': c_} for n, a_, b_, c_ in zip(*items)}
# {0: {'a': (20, 10), 'b': 1, 'c': 0}, 1: {'a': (0, 10), 'b': 0, 'c': 1}, 2: {'a': (4, 5), 'b': 0, 'c': 0}, 3: {'a': (6, 2), 'b': 0, 'c': 0}, 4: {'a': (1, 4), 'b': 0, 'c': 1}}

也可以这样写:

items = node, a, b, c
keys = 'a', 'b', 'c'
result = {x[0]: dict(zip(keys, x[1:])) for x in zip(*items)}

你也可以在这里使用map()

items = node, a, b, c
keys = 'a', 'b', 'c'
result = dict(map(lambda x: (x[0], dict(zip(keys, x[1:]))), zip(*items)))

【讨论】:

  • @tobias_k 嗯,你更愿意在这里做什么?
  • 我只是不喜欢通过再次使用相同的名称来“隐藏”列表。在旧版本的 Python 中,这甚至可能从列表理解中“泄漏”出来,即 a 之后将成为 a 的一个元素(尽管看起来不像来自 dict-comps)。为什么不使用for a_ in a 或类似的东西?
【解决方案2】:

假设您的列表大小相同,您只需遍历每个索引并为字典中的每个条目创建键/值对:

node = [0,1,2,3,4]
a = [(20,10),(0,10),(4,5),(6,2),(1,4)]
b = [1,0,0,0,0]
c = [0,1,0,0,1]

assert(len(node) == len(a) == len(b) == len(c))  #Length should be equal

mydict = dict() # init empty dict

# Loops from 0 to len(node)
for i in range(len(node)):
    entry = {'a': a[i], 'b': b[i], 'c': c[i]}  # Creates dict object matching format
    mydict[node[i]] = entry  # Sets dict as value for each node item

print(mydict)

这个输出:

{
  0: {'a': (20, 10), 'b': 1, 'c': 0}, 
  1: {'a': (0, 10), 'b': 0, 'c': 1}, 
  2: {'a': (4, 5), 'b': 0, 'c': 0}, 
  3: {'a': (6, 2), 'b': 0, 'c': 0}, 
  4: {'a': (1, 4), 'b': 0, 'c': 1}
}

【讨论】:

    猜你喜欢
    • 2022-06-27
    • 1970-01-01
    • 2018-12-17
    • 2020-04-28
    • 2019-08-09
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多