如何在列表中添加字典值的元素以及这些元素不能作为字典的另一个键重复?

2024-10-06 07:01:38 发布

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

假设我有一个列表,其中包含一个字谜字符串。例如

anList = ['aba','baa','aab','cat','tac','act','sos','oss']

我想构造一个字典,它把这个列表的元素作为键,这个元素的语法字符串将作为这个键的值作为一个列表,并且将被添加到列表中的元素不会作为该字典的另一个键重复。例如,如果“baa”已添加到列表中,而该列表是键“aba”的值,则“baa”不能进一步添加为键。输出字典应该看起来像

^{pr2}$

我尝试了很多方法,但问题是列表中添加的元素会再次作为字典的键添加。在

我怎么做?在


Tags: 字符串元素列表字典语法ossactcat
3条回答

来自@DYZ和{a2}的答案处理问题中的预期输出要比这一个好得多。在

下面是一个使用^{}的方法,它附带了一些注意事项。对每个列表元素排序以将其与anagram键进行比较,并附加与键不同的任何anagram。在

from collections import defaultdict

anagrams = ['aba','baa','aab','cat','tac','act','sos','oss']

d = defaultdict(list)
for a in anagrams:
    key = ''.join(sorted(a))
    if key != a:
        d[key].append(a)

print(d)
# {'aab': ['aba', 'baa'], 'act': ['cat', 'tac'], 'oss': ['sos']}

注意事项:

  • 始终使用升序排序的anagram版本作为dict键,这与问题中的示例输出不完全匹配
  • 如果升序排序的anagram版本不在列表中,此方法将添加一个以前不存在的anagram作为dict键

这里结合发生的顺序和它们不被组合在一起的可能性:

anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']

first_anagrams = {}
anagram_dict = {}

for word in anagram_list:
    sorted_word = ''.join(sorted(word))
    if sorted_word in first_anagrams:
        anagram_dict[first_anagrams[sorted_word]].append(word)
    else:
        first_anagrams[sorted_word] = word
        anagram_dict[word] = []

print(anagram_dict)

输出是

^{pr2}$

其中,密钥总是按出现顺序排列的第一个anagram,对于长度为可忽略的n个单词,算法严格地O(n)。在


如果您想要列表中的所有变音图(包括第一个),它会变得更容易:

anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']

first_anagrams = {}
anagram_dict = defaultdict(list)

for word in anagram_list:
    anagram_dict[first_anagrams.setdefault(''.join(sorted(word)), word)].append(word)

结果是

defaultdict(<type 'list'>, 
    {'aba': ['aba', 'baa', 'aab'], 'sos': ['sos', 'oss'], 'cat': ['cat', 'tac', 'act']})

可以使用Counter对象按字母计数对单词进行分组:

from collections import Counter
from itertools import groupby

sorted list = sorted(anList, key=Counter)
groups = [list(y) for x, y in groupby(sortedList, key=Counter)]
#[['aba', 'baa', 'aab'], ['cat', 'tac', 'act'], ['sos', 'oss']]

现在,将字谜列表转换成字典:

^{pr2}$

相关问题 更多 >