1

このような構造で

hapts = [('1|2', '1|2'), ('3|4', '3|4')]

zip次のものを取得するには、(一種の...)必要があります:

end = ['1|1', '2|2', '3|3', '4|4']

次のコードで作業を開始しました。

zipped=[] 
for i in hapts:    
    tete = zip(i[0][0], i[1][0]) 
    zipped.extend(tete)
    some = zip(i[0][2], i[1][2])
    zipped.extend(some)        

...そして、次のように圧縮しました:

zipped = [('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]

続行する方法について何か提案はありますか? さらに、これを行うためのよりエレガントな方法があるはずですが、質問の正確な定義をGoogleに渡すのは難しいです;) Thx!

4

4 に答える 4

3

あなたはこれを解決することに非常に近づいています。ここでの最良の解決策は、単純なリスト内包表記であると主張str.join()ます

["|".join(values) for values in zipped]

これには、(潜在的に) より多くの値を変更しなくてもうまく機能するというボーナスもあります。

タプルが必要な場合 (これは要求された出力が示すものではありません。括弧はタプルを作成せず、コンマは作成するため)、次のように追加するのは簡単です:

[("|".join(values), ) for values in zipped]

zippedまた、より効果的に生成できることにも注意してください。

>>> zipped = itertools.chain.from_iterable(zip(*[part.split("|") for part in group]) for group in hapts)
>>> ["|".join(values) for values in zipped]
['1|1', '2|2', '3|3', '4|4']

そして、より多くの値をエレガントに処理することについて、私が以前に意味したことを示すために:

>>> hapts = [('1|2|3', '1|2|3', '1|2|3'), ('3|4|5', '3|4|5', '3|4|5')]
>>> zipped = itertools.chain.from_iterable(zip(*[part.split("|") for part in group]) for group in hapts)
>>> ["|".join(values) for values in zipped]
['1|1|1', '2|2|2', '3|3|3', '3|3|3', '4|4|4', '5|5|5']
于 2013-01-18T14:52:42.060 に答える
1

この文脈での問題は、

  • リストを展開する
  • 再フォーマットする
  • それを折る

問題にアプローチする方法は次のとおりです

>>> reformat = lambda t: map('|'.join,  izip(*(e.split("|") for e in  t)))
>>> list(chain(*(reformat(t) for t in hapts)))
['1|1', '2|2', '3|3', '4|4']

このコンテキストでは作業コードは必要ありません

代わりに、出力で作業する必要がある場合は、再スキャンして "|" で結合するだけです。

>>> ['{}|{}'.format(*t) for t in zipped]
['1|1', '2|2', '3|3', '4|4']

ノート

出力で括弧が冗長です

于 2013-01-18T14:55:36.587 に答える
0
end = []
for groups in hapts:
    end.extend('|'.join(regrouped) for regrouped in zip([group.split('|') for group in groups]))

これは、長さ n のパイプ区切り文字のグループ、および長さ n のグループのグループでも引き続き機能しますが、再グループ化された値は、文字グループの各グループ内の最も短い文字グループに切り捨てられます。

于 2013-01-18T14:47:30.550 に答える
0

あなたのコードは基本的に機能しますが、より洗練された方法があります。

hapts最初に、エントリを取得して反転する転置関数を定義します。

>>> transpose = lambda tup: zip(*(y.split("|") for y in tup))

次に、その関数を次のようにマップしますhapts

>>> map(transpose, hapts)
... [[('1', '1'), ('2', '2')], [('3', '3'), ('4', '4')]]

そして、これを1つのリストにフラット化したい場合

>>> y = list(chain.from_iterable(map(transpose, hapts)))
... [('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]

最後に、再度結合して文字列に戻すには、次のようにします。

>>> map("|".join, y)
... ['1|1', '2|2', '3|3', '4|4']
于 2013-01-18T14:50:14.030 に答える