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]]]   

我想删除冗余列表并打印 uniq 行

[['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, set,uniq但这不起作用;它给出了错误:

AttributeError:“list”对象没有属性“readline”

print set(uniqlist)   

类型错误:不可散列类型:“列表”

任何帮助,将不胜感激。

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

首先,删除一行嵌套:

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 回答