我有一个包含各种单词的python列表。我必须使用sys.argv
从命令行获取输入,并且必须从列表中找出所有排列单词。
例如:
import sys
words_list=['llaa','lala','alal','aall','abcd','egg','adore', ...]
word=sys.argv[1]
我输入laal
作为sys.argv [1]
在这里,我想列出laal
中words_list
的所有排列。这个words_list可能包含数千个单词。请告诉我最有效的方法。我不想使用sorted
或collections.Counter
方法。
答案 0 :(得分:2)
修改
现在我看到你想要的是每个字母的匹配,包括字母数。
首先将argv [1]放入列表中,然后对其进行排序,这样您就不必每次都对其进行排序。这可以避免使用sorted
:
ARG = list(sys.argv[1])
ARG.sort()
然后定义一个函数来确定一个单词是否匹配:
def anagram_match(w):
w = list('w')
w.sort()
return w == ARG
最后,列表理解将过滤掉不匹配的单词,只留下那些单词:
[w for w in words_list if anagram_match(w)]
早期回复:
我会使用列表理解:
[w for w in words_list if sys.argv[1] in w]
如果你想检查单词中是否有任何字母,请检查是否有设置的交集:
[w for w in words_list if set(sys.argv[1]).intersection(w)]
答案 1 :(得分:1)
没有"高效"仅使用python和列表的方式。这将始终是O(n)算法。
您可以这样做:
import sys
words_list=['llaa','lala','alal','aall','abcd','egg','adore', ...]
search_word=sys.argv[1]
for word in words_list
if search_word in word:
print word
答案 2 :(得分:1)
如果我理解你的问题,这样的话会显示包含测试词中包含的每个字母的所有字符串:
words_list = [ ... whatever ... ]
word = sys.argv[1]
def contains_all(x, y):
for ch in x:
if not ch in y:
return False
return True
[x for x in words_list if contains_all(word, x)]
这将在您给出的示例中给出['llaa', 'lala', 'alal', 'aall']
...
效率并不高 - 特别是排序和统一word
会减少需要进行的比较次数。从单词中创建一个集合将是一种方法。
您问题的另一种解读可能是您要查找所有给定单词排列的单词 - 例如与上面相同的结果,但lalafoo
之类的东西不匹配,因为它包含不在测试字符串中的字母。但是,您的问题对于您想要的内容有点模糊。