在单键多值词典的python列表中,如何修改每个词典的第n个值?

问题描述 投票:0回答:2

在一个大文件中,以下是其中的一部分,我需要在循环中将1添加到某些键的第二个值(现在设置为0),但我无法找到一种方法:

[{'TCGA-KL-8331-01A-11D-2310-10': ('T>G ATG', 0)},
{'TCGA-KL-8331-01A-11D-2310-10': ('T>C CTA', 0)}, 
{'TCGA-KL-8343-01A-11D-2310-10': ('T>G TTG', 0)},
{'TCGA-KL-8343-01A-11D-2310-10': ('T>G GTC', 0)}, 
{'TCGA-KO-8417-01A-11D-2310-10': ('T>G TTA', 0)}, 
{'TCGA-KO-8417-01A-11D-2310-10': ('C>G GCA', 0)}]

如果每个字典是d,代码d.values()[1]+=1给出错误'dict_values' object does not support indexinglist(d.values())[0][1]+=1我得到'tuple' object does not support item assignment。有前进的方向吗?

编辑

输入文件是tsv,此列表在脚本中先前生成。我写道,例如:

for m in linesList:
  for n in patMutsList:
    if m.keys()==n.keys() and list(m.values())[0][2]==list(n.values())[0][0]:
      list(n.values())[0][1]+=1
python
2个回答
1
投票

如果你有这样的功能:

def increment_value(aDict):
    item = next(iter(aDict.items()))
    k,v = item
    d,n = v
    aDict[k] = d,n + 1

然后你可以像这样调用它:

values = [ {'TCGA   ...'  # rest of list of dicts elided
increment_value(values[2])
print(value[2])

输出:

{'TCGA-KL-8343-01A-11D-2310-10': ('T>G TTG', 1)}

更新:

从你的编辑看来,你正在循环上面的values(你称之为patMutsList)和n是当前的项目,所以而不是:

list(n.values())[0][1]+=1

你可以打电话:

increment_value(n)

1
投票

虽然我喜欢@ quamrana的answer,因为它适用于您的数据。

如果可能的话,你应该尝试将数据加载为dict并从tuples移动到lists,因为元组是immutable这只是提供的信息。假设每个dict都有一个键,如你所示的例子。

所以你的数据看起来像这样:

data = {
    'TCGA-KL-8331-01A-11D-2310-10': ['T>G ATG', 0],
    'TCGA-KL-8331-01A-11D-2310-10': ['T>C CTA', 0], 
    'TCGA-KL-8343-01A-11D-2310-10': ['T>G TTG', 0],
    'TCGA-KL-8343-01A-11D-2310-10': ['T>G GTC', 0], 
    'TCGA-KO-8417-01A-11D-2310-10': ['T>G TTA', 0], 
    'TCGA-KO-8417-01A-11D-2310-10': ['C>G GCA', 0]
}

这样,您可以使用以下语法更轻松地更改值:

key = 'TCGA-KL-8331-01A-11D-2310-10'
data[key][1] += 1

print(data[key])
#['T>G ATG', 1]

编辑

如果这不是一个麻烦的返工,请考虑将数据加载为字典。

考虑看看this问题。

或者,如果在加载数据后更好地完成此操作,请使用以下或其变体:

def unpack_data(data):
    unpacked = dict(_ for d in data for _ in d.items())
    return({k: list(v) for k, v in unpacked.items()})
© www.soinside.com 2019 - 2024. All rights reserved.