如何使用通用键名进行字典值比较?

2024-06-24 11:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前的代码很难看,因此我正在寻找更通用的解决方案:

我有以下python字典示例,值为字符串:

example_dict = {'key1':'AAAAAAAAAAA','key2':'BBBBAAABBBB', 'key3':'CAAAAAAACCC','key4':'DDDAADADAAA'}

请注意,字符串长度相同,仅包含大写字母:

'AAAAAAAAAAA'
'BBBBAAABBBB'
'CAAAAAAACCC'
'DDDAADADAAA'

我想对这些字符串进行迭代,并找到字符串相同的索引。以下方法是我没有做的:

for i in range(11):
    if (example_dict['key1'][i]==example_dict['key2'][i]==example_dict['key3'][i]==example_dict['key4'][i]):
        print(i)

这是有效的,正如我们看到的索引4和索引6中所有字符串都包含"A"

问题是,我想和其他字典做同样的字符串比较,它们有不同的键名(和更多/更少的项)

例如,如果我使用dictionary ex2 = {'one':'AAAAA', 'two':'ABBBA'},我需要将上面的if语句更改为

if (ex2['one'][i]==ex2['two'][i]):

是否可以在不显式命名键的情况下比较python字典值?当然,上面的问题可能非常难看——更好的问题可能是,有没有更通用的方法来完成这项任务


Tags: 方法字符串if字典exampledictkey2key1
2条回答

这对你有用吗

example_dict = {'key1': 'AAAAAAAAAAA', 'key2': 'BBBBAAABBBB',
                'key3': 'CAAAAAAACCC', 'key4': 'DDDAADADAAA'}

for i in range(11):
    index_values = [example_dict.get(k)[i] for k, v in example_dict.items()]
    if (len(set(index_values)) == 1):
        print(i)

解决方案存在于ziplist理解中:

[i for i, x in enumerate(zip(*example_dict.values())) if len(set(x))==1]

结果:

[4, 6]

zip(*example_dict.values())提供了以下结果,这些结果按索引将每个键很好地排列起来:

[('A', 'B', 'C', 'D'),
 ('A', 'B', 'A', 'D'),
 ('A', 'B', 'A', 'D'),
 ('A', 'B', 'A', 'A'),
 ('A', 'A', 'A', 'A'),
 ('A', 'A', 'A', 'D'),
 ('A', 'A', 'A', 'A'),
 ('A', 'B', 'A', 'D'),
 ('A', 'B', 'C', 'A'),
 ('A', 'B', 'C', 'A'),
 ('A', 'B', 'C', 'A')]

现在需要做的就是比较这些元组中的每个元组只有一个公共值(len(set(x))==1),并将索引返回到listenumerate提供值(x,压缩的tuple)和索引(i

相关问题 更多 >