找出python列表中包含另一个单词的排列的单词

时间:2014-06-17 16:12:08

标签: python python-2.7 python-3.x

我有一个包含各种单词的python列表。我必须使用sys.argv从命令行获取输入,并且必须从列表中找出所有排列单词。 例如:

import sys
words_list=['llaa','lala','alal','aall','abcd','egg','adore', ...]
word=sys.argv[1]

我输入laal作为sys.argv [1] 在这里,我想列出laalwords_list的所有排列。这个words_list可能包含数千个单词。请告诉我最有效的方法。我不想使用sortedcollections.Counter方法。

3 个答案:

答案 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之类的东西不匹配,因为它包含不在测试字符串中的字母。但是,您的问题对于您想要的内容有点模糊。