Python 将字典中的值替换为列表中的值

Python 将字典中的值替换为列表中的值,python,list,dictionary,Python,List,Dictionary,我试图用列表中的值替换字典中的值 我有: 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']} 通常,如果我的键的值是一个包含两个项的列表,我想

我试图用列表中的值替换字典中的值

我有:

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']}
通常,如果我的键的值是一个包含两个项的列表,我想用列表1中的特定项替换该值。我希望该方法适用于清单1中任意数量的项,这似乎是我的问题

到目前为止,我得到了:

for key in d:
    if len(d[key]) == 2:
        d[key] = list1[0]
但它只用一个值替换所有内容,我希望避免调用静态索引,因为我的列表1的长度可能会有所不同。。。我是否错过了某种循环


干杯

您可以添加一个简单的计数器(一个新变量)


您可以添加一个简单的计数器(一个新变量)


这应该可以做到:

replace = [x for x in d if len(d[x]) == 2]
for (i, x) in enumerate(replace):
   d[x] = [list1[i]]
但是,我认为在这里您需要非常小心,因为字典不是一个有序列表,因此如果要正确映射
list1
中的元素,您需要检查Python是否完全没有对字典进行无序处理。上面的代码可以很好地与提供的示例配合使用,但是此公式的任何解决方案的健壮性都将取决于您在其他地方使用字典(以及
list1
)所做的操作


很抱歉,我很挑剔,但是我在后台处理Python洗牌字典时遇到了问题,它以前破坏了我的算法。

这应该可以解决问题:

replace = [x for x in d if len(d[x]) == 2]
for (i, x) in enumerate(replace):
   d[x] = [list1[i]]
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
但是,我认为在这里您需要非常小心,因为字典不是一个有序列表,因此如果要正确映射
list1
中的元素,您需要检查Python是否完全没有对字典进行无序处理。上面的代码可以很好地与提供的示例配合使用,但是此公式的任何解决方案的健壮性都将取决于您在其他地方使用字典(以及
list1
)所做的操作

对不起,我很挑剔,但是我在后台处理Python洗牌字典时遇到了问题,它以前破坏了我的算法

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']}
结果:

{'0.0': ['1 8'], '0.25': ['10 2'], '0.5': ['8 6'], '0.75': ['3 9']}
你可以用

说明:

zip(list1,d.items())
返回:

[('10 2', ('0.25', ['10 2'])), ('8 6', ('0.5', ['8 6']))]
它只获取长度为2的键的值,因为
zip()
就是这样做的。然后我遍历列表,更改字典中与
zip(list1,d.items())中的第一个值相对应的键的值

说明:

zip(list1,d.items())
返回:

[('10 2', ('0.25', ['10 2'])), ('8 6', ('0.5', ['8 6']))]

它只获取长度为2的键的值,因为
zip()
就是这样做的。然后我遍历列表,更改字典中与
zip(list1,d.items())

中的第一个值相对应的键的值。使用filter、zip和update函数,您可以以一种安静简单的方式实现这一点:

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的好处在于,它只接受两个列表中存在的索引,因此您不必担心超出范围的错误。

使用filter、zip和update函数,您可以以一种简单的方式实现这一点:

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的好处在于它只需要两个列表上存在的索引,因此您不必担心超出范围的错误。

为什么
['11 3','9 1']
['10 2']
取代,而
['10 12',6 0']
['8 6']
取代。根据哪条一般规则,
list1
中的项可以作为替换项?注意,字典不能保证保留键的顺序。对,字典中的键没有顺序。您希望在哪个或哪个顺序中替换它们?规则是列表1中的第一项将值的第一个实例替换为两项。我不知道订单可能会改变。。。列表1中的项目是平均值:对于'11 3'和'9 1',平均值是'10 2'@kate88,字典中没有“第一个值”这样的东西。您希望如何订购钥匙?按价值计算?按插入时间?为什么
['11 3','9 1']
['10 2']
替换,而
['10 12','6 0']
['8 6']
替换。根据哪条一般规则,
list1
中的项可以作为替换项?注意,字典不能保证保留键的顺序。对,字典中的键没有顺序。您希望在哪个或哪个顺序中替换它们?规则是列表1中的第一项将值的第一个实例替换为两项。我不知道订单可能会改变。。。列表1中的项目是平均值:对于'11 3'和'9 1',平均值是'10 2'@kate88,字典中没有“第一个值”这样的东西。您希望如何订购钥匙?按价值计算?就插入时间而言?@MikeMüller任何答案的重点都不是工作代码,而是工作思想。@MikeMüller大多数语言
i++
的意思与
i++=1
的意思相同,python似乎是一种很好的语言different@Martyn对这是
i+=1
@kirelagin。对于新用户来说,尝试一些本应是无效解决方案的代码是非常令人沮丧的。他们认为自己做错了什么。如果它看起来像Python,那么它应该运行。否则,请使用伪代码并使其看起来像伪代码。@MikeMüller任何答案的重点都不是工作代码,而是工作思想。@MikeMüller大多数语言
i++
的意思与
i+=1
的意思相同。python似乎是一个很好的工具different@Martyn对这是
i+=1
@kirelagin。对于新用户来说,尝试一些本应是无效解决方案的代码是非常令人沮丧的。他们认为自己做错了什么。如果它看起来像Python,那么它应该运行。否则,请使用伪代码并使其看起来像伪代码。您应该补充一点,这仅在list1的元素数至少与字典的值(两个元素的列表)相同的情况下才有效。同意,我只是从问题中假设情况就是这样,但如果不是这样,则会导致错误。如果i==len(list1),添加子句
:break
可以很容易地解决这个问题。您应该补充一点,这只在list1为h时有效