0

私はこのようなリストを持っています

[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   
[['O_ALA_A0001', [9.05, 21.51, 64.38]]]   
[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   
[['N_TYR_A0002', [7.84, 21.93, 66.24]]]   
[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   
[['O_TYR_A0002', [5.48, 20.92, 65.6]]]   
[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   
[['N_VAL_A0003', [6.19, 18.75, 65.89]]]   
[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   

冗長なリストを削除して一意の行を出力したい

[['N_ALA_A0001', [9.25, 24.41, 64.13]]]   
[['O_ALA_A0001', [9.05, 21.51, 64.38]]]   
[['N_TYR_A0002', [7.84, 21.93, 66.24]]]   
[['O_TYR_A0002', [5.48, 20.92, 65.6]]]   
[['N_VAL_A0003', [6.19, 18.75, 65.89]]]   

試してみましたが、うまくstripいきません。エラーが発生します: setuniq

AttributeError: 'list' オブジェクトに属性 'readline' がありません

print set(uniqlist)   

TypeError: ハッシュできないタイプ: 'list'

どんな助けでも大歓迎です。

4

4 に答える 4

2

これを試して

the_list = [['N_ALA_A0001', [9.25, 24.41, 64.13]],   
        ['O_ALA_A0001', [9.05, 21.51, 64.38]],  
        ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
        ['N_TYR_A0002', [7.84, 21.93, 66.24]],   
        ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
        ['O_TYR_A0002', [5.48, 20.92, 65.6]],   
        ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
        ['N_VAL_A0003', [6.19, 18.75, 65.89]],   
        ['N_ALA_A0001', [9.25, 24.41, 64.13]]]

print map(eval, set(map(str, the_list)))

set(the_list)リストはハッシュできないため、機能しません。strハッシュ可能な型の文字列に変換するために使用します。

于 2013-09-13T13:24:22.307 に答える
1

すべての内部リストをタプルに変換してから、設定してから元に戻すことができます。

a = [['N_ALA_A0001', [9.25, 24.41, 64.13]],['O_ALA_A0001', [9.05, 21.51, 64.38]],['N_ALA_A0001', [9.25, 24.41, 64.13]], ['N_TYR_A0002', [7.84, 21.93, 66.24]], ['N_ALA_A0001', [9.25, 24.41, 64.13]], ['O_TYR_A0002', [5.48, 20.92, 65.6]], ['N_ALA_A0001', [9.25, 24.41, 64.13]], ['N_VAL_A0003', [6.19, 18.75, 65.89]], ['N_ALA_A0001', [9.25, 24.41, 64.13]]]
s = set((k, tuple(v)) for k, v in a)
a = [k, list(v) for k, v in s]

順序を維持したい場合は、OrderedDict を使用できます。

from collections import OrderedDict
s = OrderedDict({(k, tuple(v)):1 for k, v in a})
a = [[k, list(v)] for k, v in s.keys()]

私のソリューションでは、リストの要素全体が一意であることを確認することに注意してください。最初の要素 ( ) のみをチェックする場合N_ALA_A0001, ...は、 OrderedDict のように使用できます。

s = OrderedDict({k: v for k, v in a})
a = [[k, v] for k, v in s.iteritems()]
于 2013-09-13T11:56:48.290 に答える
0

最初の値に基づいて一意にしたい場合は、辞書に変換して元に戻すだけです。

the_list = [['N_ALA_A0001', [9.25, 24.41, 64.13]],   
            ['O_ALA_A0001', [9.05, 21.51, 64.38]],  
            ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
            ['N_TYR_A0002', [7.84, 21.93, 66.24]],   
            ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
            ['O_TYR_A0002', [5.48, 20.92, 65.6]],   
            ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
            ['N_VAL_A0003', [6.19, 18.75, 65.89]],   
            ['N_ALA_A0001', [9.25, 24.41, 64.13]]]

unique_list = dict(the_list).items()
于 2013-09-13T12:13:11.737 に答える
0

まず、1 行のネストを削除します。

x = [['N_ALA_A0001', [9.25, 24.41, 64.13]],   
     ['O_ALA_A0001', [9.05, 21.51, 64.38]],  
     ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
     ['N_TYR_A0002', [7.84, 21.93, 66.24]],   
     ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
     ['O_TYR_A0002', [5.48, 20.92, 65.6]],   
     ['N_ALA_A0001', [9.25, 24.41, 64.13]],   
     ['N_VAL_A0003', [6.19, 18.75, 65.89]],   
     ['N_ALA_A0001', [9.25, 24.41, 64.13]]]

これで、簡単な辞書理解で必要なものが得られます。

d = {z:w for z, w in x}

これにより、次のことが得られます。

{'O_ALA_A0001': [9.05, 21.51, 64.38], 
 'N_ALA_A0001': [9.25, 24.41, 64.13], 
 'N_VAL_A0003': [6.19, 18.75, 65.89], 
 'N_TYR_A0002': [7.84, 21.93, 66.24], 
 'O_TYR_A0002': [5.48, 20.92, 65.6]}

必要に応じて、簡単にリストに戻すことができます。

@ m01 が指摘したように、これらを順番に維持したい場合は、OrderedDict(およびマイナーな構文変更) を使用して簡単に行うことができます。

from collections import OrderedDict
d = OrderedDict(((z, w) for z, w in x))
于 2013-09-13T11:57:36.677 に答える