我正在尝试使用列表中的值替换字典中的值。
我有:
list1 = ['10 2', '8 6']
d = {'0.25': ['11 3', '9 1'], '0.75': ['3 9'], '0.5': ['10 12', '6 0'], '0.0': ['1 8']}
我希望我的字典看起来像:
dFinal = {'0.25': ['10 2'], '0.75': ['3 9'], '0.5': ['8 6'], '0.0': ['1 8']}
通常,如果my key的值是包含两个项的列表,我想用list1中的特定项替换该值。我希望这个方法适用于包含任意数量项目的list1,这似乎是我的问题。
到目前为止,我得到了:
for key in d:
if len(d[key]) == 2:
d[key] = list1[0]
但它只用一个值替换所有内容,我想避免调用静态索引,因为list1的长度可能会有所不同......我是否错过了某种循环?
干杯!
答案 0 :(得分:1)
您可以添加一个简单的计数器(一个新变量)。
i = 0
for key in d:
#check if we're not out of bounds
if i >= len(list1):
break
if len(d[key]) == 2:
d[key] = [list1[i]]
i+=1
答案 1 :(得分:1)
这应该可以解决问题:
replace = [x for x in d if len(d[x]) == 2]
for (i, x) in enumerate(replace):
d[x] = [list1[i]]
但是,我认为你需要非常小心,因为字典不是一个有序列表,所以如果list1
中的元素要正确映射,你需要检查Python是否已经' t把字典拖了一下。上面的代码在提供的示例中可以正常工作,但是这个公式的任何解决方案的稳健性将取决于您在其他地方使用字典(以及list1
)所做的事情。
很抱歉很挑剔,但我在后台遇到Python改组字典的问题,它之前破坏了我的算法。
答案 2 :(得分:1)
list1 = ['10 2', '8 6']
d = {'0.25': ['11 3', '9 1'], '0.75': ['3 9'], '0.5': ['10 12', '6 0'], '0.0': ['1 8']}
iter_list = iter(list1)
for key, value in d.items():
if len(value) == 2:
try:
d[key] = [next(iter_list)]
except StopIteration:
break
结果:
{'0.0': ['1 8'], '0.25': ['10 2'], '0.5': ['8 6'], '0.75': ['3 9']}
答案 3 :(得分:0)
您可以使用zip()
>>> list1 = ['10 2', '8 6']
>>> for x, y in zip(list1,d.items()):
... d[y[0]] = [x]
...
>>> print d
{'0.25': ['10 2'], '0.5': ['8 6'], '0.75': ['3 9'], '0.0': ['1 8']}
说明:
zip(list1,d.items())
返回:
[('10 2', ('0.25', ['10 2'])), ('8 6', ('0.5', ['8 6']))]
它只获取长度为2的键的值,因为这是zip()
的作用。然后我遍历列表,更改字典中与zip(list1,d.items())
中第一个值对应的键值。
答案 4 :(得分:0)
使用过滤器,zip和更新功能,您可以通过简单的方式实现此目的:
list1 = ['10 2', '8 6']
d = {'0.25': ['11 3', '9 1'], '0.75': ['3 9'], '0.5': ['10 12', '6 0'], '0.0': ['1 8']}
print d
target_keys = filter(lambda x: len(d[x]) == 2, d.keys())
new_list = zip(target_keys, list1)
new_dict = dict(new_list)
d.update(new_dict)
print d
关于zip的好处是它只需要两个列表中都存在的索引,因此您不必担心超出范围的错误。