0

我正在尝试用列表中的值替换字典中的值。

我有:

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 中的特定项目替换该值。我希望该方法适用于 list1 具有任意数量的项目,这似乎是我的问题。

到目前为止,我得到了:

for key in d:
    if len(d[key]) == 2:
        d[key] = list1[0]

但它只用一个值替换所有内容,我想避免调用静态索引,因为我的 list1 的长度可能会有所不同......我错过了某种循环吗?

干杯!

4

5 回答 5

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']}
于 2013-06-03T10:10:02.357 回答
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 洗牌字典时遇到了问题,并且之前它破坏了我的算法。

于 2013-06-03T10:08:52.277 回答
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
于 2013-06-03T10:07:00.677 回答
0

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

于 2013-06-03T11:17:30.157 回答
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()).

于 2013-06-03T10:50:23.230 回答