Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
比较list类型的python字典值,看看它们是否按照该顺序匹配_Python_Python 3.x_Hashmap - Fatal编程技术网

比较list类型的python字典值,看看它们是否按照该顺序匹配

比较list类型的python字典值,看看它们是否按照该顺序匹配,python,python-3.x,hashmap,Python,Python 3.x,Hashmap,我有一个字典,我想比较每个键的值(Type:List),看看它们是否按那个顺序存在。因此,本质上,我试图迭代每个键值对,并将list类型的值与下一个值进行比较,以查看该列表中的元素是否按照特定顺序匹配。如果我们找到匹配项,我想返回匹配项的键列表 例如:s1值是一个包含元素“a”、“b”、“c”、“d”、“e”的列表,所以我想用相同的顺序检查其他值。因此,在本例中,将返回键s3,因为值与相同的精确顺序匹配。 s1值=s3值,因为列表中的元素按相同顺序匹配。 返回列表类似于[s1:s3],应该返回多

我有一个字典,我想比较每个键的值(Type:List),看看它们是否按那个顺序存在。因此,本质上,我试图迭代每个键值对,并将list类型的值与下一个值进行比较,以查看该列表中的元素是否按照特定顺序匹配。如果我们找到匹配项,我想返回匹配项的键列表

例如:s1值是一个包含元素“a”、“b”、“c”、“d”、“e”的列表,所以我想用相同的顺序检查其他值。因此,在本例中,将返回键s3,因为值与相同的精确顺序匹配。 s1值=s3值,因为列表中的元素按相同顺序匹配。
返回列表类似于[s1:s3],应该返回多个匹配项

要查找匹配列表,可以执行以下操作:

prefs = 
{
    's1': ["a", "b", "c", "d", "e"],
    's2': ["c", "d", "e", "a", "b"],
    's3': ["a", "b", "c", "d", "e"],
    's4': ["c", "d", "e", "b", "e"]
}
其中打印:

prefs = {
    's1': ["a", "b", "c", "d", "e"],
    's2': ["c", "d", "e", "a", "b"],
    's3': ["a", "b", "c", "d", "e"],
    's4': ["c", "d", "e", "b", "e"],
    's5': ["c", "d", "e", "b", "e"]
}

matches = {}
for key, value in prefs.items():
    value = tuple(value)
    if value not in matches:
        matches[value] = []
    matches[value].append(key)

print(matches)
print(*matches.values())
(注意:我在
prefs
中添加了
s5


更新

如果只需要分组键,可以通过
matches.values()
访问它们:

其中打印:

prefs = {
    's1': ["a", "b", "c", "d", "e"],
    's2': ["c", "d", "e", "a", "b"],
    's3': ["a", "b", "c", "d", "e"],
    's4': ["c", "d", "e", "b", "e"],
    's5': ["c", "d", "e", "b", "e"]
}

matches = {}
for key, value in prefs.items():
    value = tuple(value)
    if value not in matches:
        matches[value] = []
    matches[value].append(key)

print(matches)
print(*matches.values())
此外,如果您愿意,您可以在一行中完成整个过程:

['s4', 's5'] ['s1', 's3'] ['s2']

首先使用
sorted
按值排序,然后使用
itertools.groupby

print({value: [key for key in prefs if tuple(prefs[key]) == value] for value in set(map(tuple, prefs.values()))})
要使用值打印,请执行以下操作:

prefs = {
            's1': ["a", "b", "c", "d", "e"],
            's2': ["c", "d", "e", "a", "b"],
            's3': ["a", "b", "c", "d", "e"],
            's4': ["c", "d", "e", "b", "e"],
            's5': ["c", "d", "e", "a", "b"]
        }

from itertools import groupby
[[t[0] for t in g] for k,g in groupby(sorted(prefs.items(), key=lambda x:x[1]), lambda x:x[1])]
#[['s1', 's3'], ['s2', 's5'], ['s4']]
输出:

{tuple(k):[t[0] for t in g] for k,g in groupby(sorted(prefs.items(), key=lambda x:x[1]), lambda x:x[1])}

所以s2被返回,但它没有匹配项,我只是假设如果一个列表没有返回2个键,那么它就没有匹配项。但我很难跟踪if后的情况。所以基本上你创建了一个新的散列并将值转换成一个元组。然后检查匹配项{}中是否不存在该值。但在那一行之后我有点迷路了。您可以将该值设置为空数组,但可以在if之后解释这些行。我如何验证代码,如果有多个匹配项,我将2个键作为一个集合返回,而不是仅返回列表中的所有键。我打开了一个新问题@Transhuman您如何打印值。我正在想办法把它打印到控制台上。