0

アイデアは、元のリストからの順序を維持しながら、特定の文字数の文字列のリストを作成することです。課題は、リスト内包表記のみを使用してそれを達成することです。

list_string = [ "aaa", "bb", "cc", "dd", "ee"]
str_len = 6
[some_list_comprehension]

結果は次のようになり["aaabb", "ccddee"]ます。元のリストの文字列はチャンク化できないためaaabb、結果リストの文字列は 5 文字ですが、文字列は6 文字です。ccddee文字列の順序は、結果の作成中には関係がありますが、結果には関係がないため、最後のリストは可能ですが、そうではあり["ccddee", "aaabb"]ません["eeddcc", "bbaaa"]。各文字列は元のリストと同じ回数だけ結果リストに表示されます。つまり、文字列のすべての可能な組み合わせがこの問題の目的ではないことを意味します。これは主に、結果リストの各文字列が次の順序で作成されるためです。オリジナル。 可能な出力は 2 つだけです。

["aaabb", "ccddee"]

また

["ccddee", "aaabb"]
4

2 に答える 2

2

わかりました、私は今それを手に入れたと思います。これはあなたが探していたものですか?

>>> list_string = [ "aaa", "bb", "cc", "dd", "ee"]
>>> str_len = 6
>>> [[''.join(list_string[:i]), ''.join(list_string[i:])] for i in xrange(len(list_string)) if all(1 <= len(s) <= str_len for s in [''.join(list_string[:i]), ''.join(list_string[i:])])]
[['aaabb', 'ccddee']]

これにより、文字列の1つのパーティション化で機能した可能性のあるすべての組み合わせが生成されます。考えられるすべての結果は次のとおりです。

>>> for str_len in range(len(''.join(list_string))):
        print str_len, [[''.join(list_string[:i]), ''.join(list_string[i:])] for i in xrange(len(list_string)) if all(1 <= len(s) <= str_len for s in [''.join(list_string[:i]), ''.join(list_string[i:])])]


0 []
1 []
2 []
3 []
4 []
5 []
6 [['aaabb', 'ccddee']]
7 [['aaabb', 'ccddee'], ['aaabbcc', 'ddee']]
8 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee']]
9 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee'], ['aaabbccdd', 'ee']]
10 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee'], ['aaabbccdd', 'ee']]

編集:これはfilter、式で結果を2回使用するが複製しないバージョンであり、より適切なフォーマットになっています。

>>> filter(
        lambda res: all(1 <= len(s) <= str_len for s in res),
        [[''.join(list_string[:i]), ''.join(list_string[i:])]
         for i in xrange(len(list_string))])
[['aaabb', 'ccddee']]
于 2012-07-13T20:53:07.513 に答える
1
from itertools import combinations
list_string = [ "aaa", "bb", "cc", "dd", "ee"]
minn=min(map(len,list_string))
maxx=max(map(len,list_string))
str_len=6
lis=[''.join(x) for i in range(1,maxx+1) for x in combinations(list_string,i) if len(''.join(x))<=str_len]        
print lis

出力:

['aaa', 'bb', 'cc', 'dd', 'ee', 'aaabb', 'aaacc', 'aaadd', 'aaaee', 'bbcc', 'bbdd', 'bbee', 'ccdd', 'ccee', 'ddee', 'bbccdd', 'bbccee', 'bbddee', 'ccddee']
于 2012-07-13T20:25:39.920 に答える