Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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/1/list/4.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_List_Dictionary - Fatal编程技术网

如何在Python中将一个列表中的值与列表字典中的唯一值进行匹配

如何在Python中将一个列表中的值与列表字典中的唯一值进行匹配,python,list,dictionary,Python,List,Dictionary,因此,我的输入值如下所示: temp_dict1 = {'A': [1,2,3,4], 'B':[5,5,5], 'C':[6,6,7,8]} temp_dict2 = {} val = [5] for i in temp_dict1: for j in temp_dict1[i]: for k in val: if k in j: temp_dict2.setdefault(i, []).append(k) 列

因此,我的输入值如下所示:

temp_dict1 = {'A': [1,2,3,4], 'B':[5,5,5], 'C':[6,6,7,8]}
temp_dict2 = {}
val = [5]
for i in temp_dict1:
    for j in temp_dict1[i]:
        for k in val:
            if k in j:
                temp_dict2.setdefault(i, []).append(k)
列表
val
可能包含更多值,但目前仅包含一个值。我期望的结果是:

>>>temp_dict2
{'B':[5]}
最后一个字典只需要具有包含列表
val
中项目的列表的键,并且在列表中只需要该值的唯一实例。我已尝试按如下方式遍历这两个对象:

temp_dict1 = {'A': [1,2,3,4], 'B':[5,5,5], 'C':[6,6,7,8]}
temp_dict2 = {}
val = [5]
for i in temp_dict1:
    for j in temp_dict1[i]:
        for k in val:
            if k in j:
                temp_dict2.setdefault(i, []).append(k)

但它只返回一个类型为“int”的
参数不可编辑
错误消息。有什么想法吗?

更改了词典以涵盖更多案例:

temp_dict1 = {'A': [1,2,3,4], 'B':[5,5,6], 'C':[6,6,7,8]}
temp_dict2 = {}
val = [5, 6]

for item in val:
    for key, val in temp_dict1.items():
        if item in val:
            temp_dict2.setdefault(key, []).append(item)

print(temp_dict2)
# {'B': [5, 6], 'C': [6]}
或者,同样使用列表理解(看起来有点难理解,不推荐)

为了与进行比较,也可以通过集合来实现。defaultdict:

from collections import defaultdict

temp_dict1 = {'A': [1,2,3,4], 'B':[5,5,6], 'C':[6,6,7,8]}
temp_dict2 = defaultdict(list)
val = [5, 6]

for i in val:
    for k, v in temp_dict1.items():
        if i in v:
            temp_dict2[k].append(i)

# defaultdict(list, {'B': [5, 6], 'C': [6]})

您可以尝试以下方法:

temp_dict1 = {'A': [1,2,3,4,5,6], 'B':[5,5,5], 'C':[6,6,7,8]}
val = [5,6]


def values(dict_,val_):
    default_dict={}
    for i in val_:
        for k,m in dict_.items():
            if i in m:
                if k not in default_dict:
                    default_dict[k]=[i]
                else:
                    default_dict[k].append(i)
    return default_dict
print(values(temp_dict1,val))
输出:

{'B': [5], 'C': [6], 'A': [5, 6]}

因为
j
是一个
int
并且
如果j
中的k试图迭代它。我猜你想在
I
上迭代,然后可以删除temp_dict1[I]中j的
行。这听起来在概念上不合理:如果
5
出现在
'B'
'C'
中,你想要的结果是什么?@MarcusMüller如果temp_dict1如下:
temp_dict1={'A':[1,2,3,4,5],'B':[5,5,5],'C':[5,5,6,6,7,8]}
我希望temp_dict2返回:
{'A':[5],'B':[5],'C'[5]}
。我知道这可能看起来很奇怪,对于我的任务来说,它会完成工作。好吧,
temp_dict
那么如果
val=[5,1]
会是什么样子?为什么是列表理解?只需使用字典理解。@BurhanKhalid,因为我使用的是
dict.setdefault()
函数,我认为它不能用于字典理解。在文档中,我发现
defaultdict
的性能优于
setdefault
。但是,
defaultdict
需要额外导入。那么,哪一个性能更好呢?老实说,如果您担心导入
collections.defaultdict
所需的毫秒数,请不要使用Python编写代码。你说得对,我只是想知道哪一个更好用(将来)。我的建议是遵循文档。虽然我还没有看过C代码优化,但我相信文档会说它是优化的,这是有原因的。