如何在python中获取uniq列表

2024-06-01 11:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的单子

[['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行

^{pr2}$

我试过,stripsetuniq,但这不起作用;它给出了错误:

AttributeError: 'list' object has no attribute 'readline'

print set(uniqlist)   

TypeError: unhashable type: 'list'

任何帮助都将不胜感激。在


Tags: 列表错误vallist单子attributeerrorstripset
3条回答

可以将所有内部列表转换为元组,然后生成集合,然后再将其转换回:

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:

^{pr2}$

注意,我的解决方案检查列表的整个元素的唯一性。如果只想检查第一个元素(N_ALA_A0001, ...),可以使用OrderedDict

s = OrderedDict({k: v for k, v in a})
a = [[k, v] for k, v in s.iteritems()]

试试这个

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将其转换为散列类型的字符串。在

首先,移除一行嵌套:

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

现在,一个简单的字典理解就能得到你所需要的:

^{pr2}$

它给出了:

{'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))

相关问题 更多 >