Python 如何从给定字母表中按升序查找单词

Python 如何从给定字母表中按升序查找单词,python,python-2.7,list,Python,Python 2.7,List,我有一系列的 words=[a,b,c,d] 我想找到可以按升序排列的单词 结果列表已显示 [a,ab,abc,abcd,b,bc,bcd,c,cd,d] 怎么做 我有代码,但它混合了C和python,有人能帮我看看它的python等价物吗 下面是: word_list=input("Enter the word") n=len(word_list) newlist=[] for(i=0;i<n;i++) { c='' for(j=i;j<n;j++)

我有一系列的

words=[a,b,c,d]
我想找到可以按升序排列的单词

结果列表已显示

[a,ab,abc,abcd,b,bc,bcd,c,cd,d]
怎么做

我有代码,但它混合了C和python,有人能帮我看看它的python等价物吗

下面是:

word_list=input("Enter the word")
n=len(word_list)
newlist=[]
for(i=0;i<n;i++)
    {
    c=''
    for(j=i;j<n;j++)
        {
        c.join(j)
        newlist=append(c)
        }
    }
word\u list=输入(“输入单词”)
n=len(单词列表)
新列表=[]

对于(i=0;i您可以使用
itertools

>>> import itertools
>>> w=['a','b','c','d']
>>> result=[]
>>> for L in range(1, len(w)+1):
...   for subset in itertools.combinations(w, L):
...     result.append(''.join(subset))
... 
>>> result
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'bd', 'cd', 'abc', 'abd', 'acd', 'bcd', 'abcd']

您可以使用
itertools

>>> import itertools
>>> w=['a','b','c','d']
>>> result=[]
>>> for L in range(1, len(w)+1):
...   for subset in itertools.combinations(w, L):
...     result.append(''.join(subset))
... 
>>> result
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'bd', 'cd', 'abc', 'abd', 'acd', 'bcd', 'abcd']
你可以很容易地用它
Itertools
对于这类东西有一些很棒的功能。
Itertools.compositions
正是你想要的

语法是:

itertools.combinations(iterable [, length] )
因此,您可以直接输入
单词的
列表
,因为它是一个
iterable
。由于您需要所有不同的长度,您必须在
for循环中执行该操作
,以获得所有长度的组合列表

因此,如果你的话是:

words = ['a', 'b', 'c', 'd']
而你做到了:

import itertools
itertools.combinations(words, 2)
您将返回一个
itertools对象
,您可以使用
list()
轻松地将其转换为列表:

将返回:

[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
但是,如果您想要一个所有长度的列表(即仅包括“a”和“abc”),那么您可以
将每个列表的每个单独列表的结果扩展到另一个所有长度的列表上。例如:

import itertools
words = ['a', 'b', 'c', 'd']

combinations = []

for l in range(1, len(words) + 1):
   combinations.extend(list(itertools.combinations(words, l )))
这将为您提供以下结果:

[('a'), ('b'), ('c'), ('d'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b, 'd'), ('c', 'd'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd), ('a', 'b', 'c', 'd')]
如果您想让它们更具可读性(如
字符串
而不是
元组
),您可以使用
列表理解

combinations = [''.join(c) for c in combinations]
所以现在组合只是一个字符串数组:

['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'bd', 'cd', 'abc', 'abd', 'acd', 'bcd', 'abcd']
你可以很容易地用它
Itertools
对于这类东西有一些很棒的功能。
Itertools.compositions
正是你想要的

语法是:

itertools.combinations(iterable [, length] )
因此,您可以直接输入
单词的
列表
,因为它是一个
iterable
。由于您需要所有不同的长度,您必须在
for循环中执行该操作
,以获得所有长度的组合列表

因此,如果你的话是:

words = ['a', 'b', 'c', 'd']
而你做到了:

import itertools
itertools.combinations(words, 2)
您将返回一个
itertools对象
,您可以使用
list()
轻松地将其转换为列表:

将返回:

[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
但是,如果您想要一个所有长度的列表(即仅包括“a”和“abc”),那么您可以
将每个列表的每个单独列表的结果扩展到另一个所有长度的列表上。例如:

import itertools
words = ['a', 'b', 'c', 'd']

combinations = []

for l in range(1, len(words) + 1):
   combinations.extend(list(itertools.combinations(words, l )))
这将为您提供以下结果:

[('a'), ('b'), ('c'), ('d'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b, 'd'), ('c', 'd'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd), ('a', 'b', 'c', 'd')]
如果您想让它们更具可读性(如
字符串
而不是
元组
),您可以使用
列表理解

combinations = [''.join(c) for c in combinations]
所以现在组合只是一个字符串数组:

['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'bd', 'cd', 'abc', 'abd', 'acd', 'bcd', 'abcd']

你在用什么编译器/解释器运行这段代码?你在用什么编译器/解释器运行这段代码?你在用什么编译器/解释器运行这段代码?你可能在用什么编译器/解释器运行这段代码?你可能在用[1,2,3]这段代码。这段代码很好,很短,很有效!但是你得到了一个列表…如果你想要一个字符串列表,你应该做
words=[''。join(w[开始:结束+1])用于范围内的开始(n)用于范围内的结束(开始,n)]
@Dadep不需要。
输入将产生一个字符串,因此,
单词将是一个字符串列表。是的,对不起,因为您的字符串与原始问题之间存在差异,前者包含所有字母,而后者为
单词list@Dadep实际上,第一行是从问题中的代码。冲突是提问者提供的文本和代码之间的冲突,哦,是的,你说得对!我没有太注意奇怪的代码部分,对不起。这很好,很短,很有效!但是你得到了一个列表…如果你想要一个字符串列表,你应该做
words=[''。加入(w[start:end+1])作为范围(n)内的开始对于范围内的结束(开始,n)]
@Dadep不需要。
输入将产生一个字符串,因此,
单词将是一个字符串列表。是的,对不起,因为您的字符串与原始问题之间存在差异,前者包含所有字母,而后者为
单词list@Dadep实际上,第一行是从m问题中的代码。冲突在于提问者提供的文本和代码之间,哦,是的,你说得对!我没有太注意奇怪的代码部分,对不起。你的范围应该从
1
len(w)+1
而不是
0
:)你的范围应该从
1
len(w)+1
不是来自
0
:)