【问题标题】:Remove duplicate entries in list using python使用python删除列表中的重复条目
【发布时间】:2012-03-20 09:35:40
【问题描述】:

我有一个大文件,其中的条目在 python 中打开为:

 fh_in=open('/xzy/abc', 'r') 
 parsed_in=csv.reader(fh_in, delimiter=',')
 for element in parsed_in:
  print(element)

结果:

['ABC', 'chr9', '3468582', 'NAME1', 'UGA', 'GGU']

['DEF', 'chr9', '14855289', NAME19', 'UCG', 'GUC']

['TTC', 'chr9', '793946', 'NAME178', 'CAG', 'GUC']

['ABC', 'chr9', '3468582', 'NAME272', 'UGT', 'GCU']

我必须只提取唯一条目并删除 col1、col2 和 col3 中具有相同值的条目。就像在这种情况下,根据 col1、col2 和 col3,最后一行与第 1 行相同。

我试过两种方法都失败了:

方法一:

outlist=[]

for element in parsed_in:     
  if element[0:3] not in outlist[0:3]:
    outlist.append(element)

方法二:

outlist=[]
parsed_list=list(parsed_in)
for element in range(0,len(parsed_list)):
  if parsed_list[element] not in parsed_list[element+1:]:
    outlist.append(parsed_list[element])

这些都返回所有条目,而不是基于前 3 列的唯一条目。

请给我建议一个这样做的方法

AK

【问题讨论】:

标签: python list unique duplicate-removal


【解决方案1】:

您可能希望在添加时使用 O(1) 查找来保存对元素的完整扫描,就像 Caol Acain 所说,集合是一种很好的方法。

你想做的是这样的:

outlist=[]
added_keys = set()

for row in parsed_in:
    # We use tuples because they are hashable
    lookup = tuple(row[:3])    
    if lookup not in added_keys:
        outlist.append(row)
        added_keys.add(lookup)

您也可以使用字典将键映射到行,但这需要注意的是您不会保留输入的顺序,因此拥有列表和键集可以让您保持顺序-文件。

【讨论】:

  • 第一个好答案,比我要发布的要好得多。 +1
【解决方案2】:

【讨论】:

  • 我也是这么想的,但是如果你仔细阅读这个问题,你会发现集合不起作用。列表中的每个项目仅在子列表的前三个元素上是唯一的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2013-03-09
  • 2023-04-01
  • 2011-12-02
  • 2014-09-19
  • 2011-09-29
相关资源
最近更新 更多