【问题标题】:How can I map lists to dict key as value如何将列表映射到 dict 键作为值
【发布时间】:2019-05-10 11:25:23
【问题描述】:

我有一个迭代器对象,然后在迭代时有它的每个项目属性,其中对时间和价值感兴趣

[(point.time, point.value) for point in control_points]
[(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]

时间和价值都是Fraction对象

现在我必须构建一个数据结构,其映射方式是第一个元组是 in_time 字典,第二个元组是 out_time 字典

({'in_time': "" , 'in_value': ""} , {'out_time': "", 'out_value': ""})

我也尝试过使用类似这样的列表的不同方式:

container = [['in_time', 'in_value'] , ['out_time', 'out_value']]

dict(zip([objects for objects in container, [(point.time, point.value) for point in contol_points]]))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required

我希望这样的事情是可能的:https://stackoverflow.com/a/33737067/9567948

【问题讨论】:

  • 我不清楚你想要什么。您建议使用两个字典的元组。这是每个输入点吗?还是您的列表中只有两个元组?
  • 两者都可以,我只是在尝试

标签: python list dictionary collections


【解决方案1】:

这是我的尝试:

我在 zip 中使用 * 迭代器来访问这两个列表,但是排序不正确,所以我需要再次循环调整排序。

from fractions import Fraction
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]
control_points = [(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]

zipped_list = list(zip(*container,*control_points))
new_dict={}
i=0
for element in zipped_list:

    while((i+3)<=len(element)):
        print([element[i]], element[i+2])
        new_dict[element[i]]=element[i+2]
        i+=1
    i=0

print(new_dict)

输出:

对于 Python 2:

from fractions import Fraction
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]
control_points = [(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]


zipped_list = dict(zip([element for x in container for element in x],[element for y in control_points for element in y]))
print(zipped_list)

输出:

【讨论】:

  • 你好 Richard,看起来像 list(zip(*container,*control_points)) 在 python 2 中抛出语法错误
  • 嘿,Chang,看起来在 Python 2 中 * 用于解压缩,而 zip 函数已经迭代。 Python 2 documentation。检查izip function 实际上,我相信这是等效的,但无法测试它,因为我不相信它在 Python 3 中。
  • 我刚刚添加了一个我认为适用于 python 2 的解决方案。
【解决方案2】:

忽略分数并使用整数显示一种方法:

给定

control_points = [point(-1, 0), point(24, 100)]
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]

通知

{ container[0][0]:control_points[0].time, container[0][1] : control_points[0].value }

给予

{'in_time': -1, 'in_value': 0}

所以,这是第一个项目。 如果你像这样枚举container

[{ c[0]:control_points[i].time, c[1] : control_points[i].value } for i,c in enumerate(container)]

你明白了:

[{'in_time': -1, 'in_value': 0}, {'out_time': 24, 'out_value': 100}]

这在两点上看起来确实有点过头了,但它展示了如何进行字典比较和枚举。

【讨论】:

    猜你喜欢
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多