Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过检查列表和原始词典python为词典添加值?_Python_Python 2.7_Python 3.x_Dictionary - Fatal编程技术网

如何通过检查列表和原始词典python为词典添加值?

如何通过检查列表和原始词典python为词典添加值?,python,python-2.7,python-3.x,dictionary,Python,Python 2.7,Python 3.x,Dictionary,我有一个列表,其中包含从1到1500的ID。列表如下所示 totalID=['1'、'2'、'3'、...'1499'、'1500'] 在字典中,某些ID的分数为(-1到4) 我想添加其余的ID(totalID-dictionaryID),它没有出现在分数为“5”的字典中 例如: Q216 .............. {'1': ['156'], '-1': ['506']} 新值是否为 {'1': ['156'], '-1': ['506'], '5':['1','2','3','4'

我有一个列表,其中包含从1到1500的ID。列表如下所示

totalID=['1'、'2'、'3'、...'1499'、'1500']

在字典中,某些ID的分数为(-1到4)

我想添加其余的ID(totalID-dictionaryID),它没有出现在分数为“5”的字典中

例如:

Q216 ..............   {'1': ['156'], '-1': ['506']}
新值是否为

{'1': ['156'], '-1': ['506'],
'5':['1','2','3','4','5',....'155','157'..'505','507','508',..'1500']}
如何根据totalID和OriginalICT编辑词典

 originalDICT={'Q216': {'1': ['156'], '-1': ['506']}, 'Q217': {'1': ['666', '667', '1395'], '3': ['668', '670', '1204', '1300', '37', '559', '630', '1107', '1213'], '2': ['1258', '1394'], '-1': ['1191'], '4': ['1391']}, 'Q214': {'3': ['833', '1361', '1362', '1363'], '-1': ['1294']}, 'Q215': {'-1': ['535'], '4': ['37', '35']}, 'Q212': {'3': ['885', '887', '886', '890', '769', '891', '1173', '843'], '2': ['888', '889', '1178'], '-1': ['1146'], '4': ['841', '1176', '1177']} }

for key, value in originalDICT.iteritems():
    print key,"..............  ", value

Q216 ..............   {'1': ['156'], '-1': ['506']}
Q217 ..............   {'1': ['666', '667', '1395'], '3': ['668', '670', '1204', '1300', '37', '559', '630', '1107', '1213'], '2': ['1258', '1394'], '-1': ['1191'], '4': ['1391']}
Q214 ..............   {'3': ['833', '1361', '1362', '1363'], '-1': ['1294']}
Q215 ..............   {'-1': ['535'], '4': ['37', '35']}
Q212 ..............   {'3': ['885', '887', '886', '890', '769', '891', '1173', '843'], '2': ['888', '889', '1178'], '-1': ['1146'], '4': ['841', '1176', '1177']}
如何更新字典???

一行

original_dict[5] = [i+1 for i in range(1500) if i not in original_dict]

这里的第一步是查找字典中已经存在的所有ID。让我们使用集合理解:

known_ids = {item for sublist in original_dict.values() for item in sublist}
接下来,让我们用所有不在
已知\u ID
中的ID更新字典:

original_dict['5'] = [id for id in total_id if id not in known_ids]
如果您想要一本新词典,并且希望保留原始词典,请尝试以下操作:

import copy
new_dict = copy.deepcopy(original_dict)  # use deepcopy because you have mutable containers inside the dict
new_dict['5'] = [id for id in total_id if id not in known_ids]
如果某些内容可能已分配给“5”,请尝试以下操作:

original_dict['5'].extend(id for id in total_id if id not in known_ids)
注意,我已经从列表理解改为生成器表达式,因为我们不需要多次创建值

编辑:基于(现在,显然是已删除的注释),如果
total\u id
是一个集合而不是列表,则可以使用集合操作

total_id = set(total_id)
original_dict['5'] = list(total_id - known_ids)
# or
original_dict['5'].extend(total_id - known_ids)
取决于多个因素,这可能比列表中的
结构快,也可能不快

编辑2:考虑到OP的
原始ICT
的实际格式,我们需要对以下内容做更多的修改:

known_ids = {key: {item for sublist in value.values() for item in sublist} for key, value in originalDICT.items()}
for key, known_id_set in known_ids.items():
    originalDICT[key]['5'] = [id for id in total_id if id not in known_ids]
    # or, if '5' is already populated
    originalDICT[key]['5'].extend(id for id in total_id if id not in known_ids]
    # or, if total_id is a set
    originalDICT[key]['5'] = list(total_id - known_id_set)

因为这次我们只更新了最外层词典的一部分,所以要理解词典就更难了(不可能?我没想太多)。这里的显式for循环可能是更清晰的解决方案。

在您提到的问题中,“我想添加字典中未出现的其余ID(totalID-dictionaryID)”,但示例
1
仍然存在,即使它是字典中的一个键?请你能准确和清楚地说明你的想法吗want@MoinuddinQuadri“1”:[156']。。。“1”表示分数为1,因此它表示字典中没有出现ID=1。我强烈建议将ID设置为int并用作字典键。这是不对的。因为dict里面是数组。你在{1:[112,12]}中试了12次吗?你说得对!我一开始致力于拍摄现场,但后来逐渐淡出了舞台。我本来打算让OP使用list作为
total\u id
,不幸的是,这不会有
差异
total_id=set(total_id)
可能会有帮助。已知的_id=set(['1','3','2','-1','4'])我认为已知的_id是错误的,你得到的是分数,而不是id。已知的_id对于Q216应该是['156'],['506'],等等。
d={'1':['156'],'-1':['506'];已知_id={d中的子列表项。子列表中的项的值()为};assert known_id=={'506','156'}
在Python 2和Python 3中都适用。我是否错误地解释了输入词典的格式?哦!我明白问题所在。更新的回答传入。