0

単純なネストされたリスト内包表記の作成に問題があります。アンパックの各レベルでは、リスト構造からリストが適切に削除されません。詳細は以下。

file_list = ['genes1.csv', 'genes2.csv']

set_list = [('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953])), ('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]))]

set_list.sort(key = lambda (x,y): file_list.index(x))

ソートされた set_list を見てみましょう:

print '\nset_list sorted:', set_list

set_list sorted: [('genes1.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117])), ('genes2.csv', (['A2LD1', 'A1BG', 'A2ML1', 'A1CF', 'A2M', 'A2BP1'], [-0.95, 1.226, 3.473, 4.958, 6.645, 11.953]))]

次に、サンプル 1 の値のみを取得します。この場合は、genes1.csv の値です。

sample_1_values = []
for i, (j, k) in set_list[:1]:
    for v in k:
        sample_1_values.append(v)

print '\nsample 1 values:', sample_1_values

そして出力:

sample 1 values: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]

ここでの目的は、ネストされたリスト内包表記として sample_1_values を作成することです。

sample_1_values = [[v for v in k] for i, (j, k) in set_list[:1]]

print '\nsample_1_values from list comprehension:', sample_1_values

そして出力:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]

まず、ネスト構造を分解しましょう。

s_list_comp_1 = [k for i, (j, k) in set_list[:1]]

print '\ninner list comprehension:', s_list_comp_1
print type(s_list_comp_1)

出力:

inner list comprehension: [[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]
<type 'list'>

開梱は行われていません。次に、外側のネストについて:

s_list_comp_2 = [v for v in s_list_comp_1]

print '\nouter list comprehension', s_list_comp_2
print type(s_list_comp_2)

出力:

[[-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]]
<type 'list'>

同じ問題で、今回はリストが解凍されていません。for ステートメントと append を使用すると、適切に動作することがわかります。

s_list_comp_2 = []
for v in s_list_comp_1:
    for l in v:
        s_list_comp_2.append(l)

print '\ncorrect unpacking:', s_list_comp_2

出力:

correct unpacking: [-0.529, 1.444, 3.133, 4.303, 6.387, 11.117]

正しいアンパックは、ネストされたリスト内包表記を使用して複製できない別のレベルの階層を使用します。sample_1_values を作成する式全体は、このプレースホルダーなしで後で挿入するネストされたリスト内包表記でなければなりません。提案?

4

1 に答える 1

2

私があなたを正しく理解していれば、あなたはこれを望んでいます:

[v for i, (j, k) in set_list[:1] for v in k]

「内部リスト内包表記」の例では、リスト内包表記は のk各アイテムから値を単純に生成しset_list、そのアイテムはリストであるため、アンパックは発生しません。

元の例では:

[[v for v in k] for i, (j, k) in set_list[:1]]

アイテムは によってアンパックされv for v in kますが、それらから新しいリストを作成して再パックします (ネストされたリスト内包表記を使用)。

必要なのは、ネストされたリスト内包表記ではなく、複数のfor句を持つ単一のリスト内包表記です。

于 2013-05-26T19:09:54.793 に答える