【问题标题】:Unique elements of sublists depending on specific value in sublist子列表的唯一元素取决于子列表中的特定值
【发布时间】:2020-05-28 03:11:59
【问题描述】:

我试图从一个非常大且不一致的列表中选择唯一的数据集。 我的数据集 RawData 由不同长度的字符串项组成。 有些项目出现多次,例如:['a','b','x','15/30'] 比较键项目始终是最后一个字符串:例如'15/30'

目标是:获取一个列表:UniqueData,其中包含仅出现一次的项目。 (我想保持秩序)

数据集:

RawData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['a','x','c','15/30'],['i','j','k','l','m','n','o','p','20/60'],['x','b','c','15/30']]

我想要的解决方案数据集:

UniqueData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['i','j','k','l','m','n','o','p','20/60']]

我尝试了许多可能的解决方案,例如:

for index, elem in enumerate(RawData): 并附加到新列表,如果.....

for element in list 不起作用,因为项目不完全相同。

您能帮我找到解决问题的方法吗?

谢谢!

【问题讨论】:

    标签: python python-3.x list duplicates


    【解决方案1】:

    删除重复项的最佳方法是将它们添加到集合中。将最后一个元素添加到 set 中,以跟踪所有唯一值。当您要添加的值已经存在于集合 unique 中时,如果不存在则不执行任何操作,将值添加到集合 unique 并将 lst 附加到结果列表中,它是 new

    试试这个。

    new=[]
    unique=set()
    for lst in RawData:
         if lst[-1] not in unique:
             unique.add(lst[-1])
             new.append(lst)
    
    print(new)
    #[['a', 'b', 'x', '15/30'],
     ['d', 'e', 'f', 'g', 'h', '20/30'],
     ['w', 'x', 'y', 'z', '10/10'],
     ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60']]
    

    【讨论】:

      【解决方案2】:

      您可以为唯一数据设置一个新数组,并跟踪您迄今为止看到的项目。然后,当您遍历数据时,如果您之前没有看到该列表中的最后一个元素,则将其附加到唯一数据并将其添加到已看到的列表中。

      RawData = [['a', 'b', 'x', '15/30'], ['d', 'e', 'f', 'g', 'h', '20/30'], ['w', 'x', 'y', 'z', '10/10'],
                 ['a', 'x', 'c', '15/30'], ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60'], ['x', 'b', 'c', '15/30']]
      seen = []
      UniqueData = []
      for data in RawData:
          if data[-1] not in seen:
              UniqueData.append(data)
              seen.append(data[-1])
      
      print(UniqueData)
      

      输出

      [['a', 'b', 'x', '15/30'], ['d', 'e', 'f', 'g', 'h', '20/30'], ['w', 'x', 'y', 'z', '10/10'], ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '20/60']]
      

      【讨论】:

        【解决方案3】:
            RawData = [['a','b','x','15/30'],['d','e','f','g','h','20/30'],['w','x','y','z','10/10'],['a','x','c','15/30'],['i','j','k','l','m','n','o','p','20/60'],['x','b','c','15/30']]
        
        seen = []
        seen_indices = []
        
        for _,i in enumerate(RawData):
          # _ -> index
          # i -> individual lists
          if i[-1] not in seen:
           seen.append(i[-1])
          else:
           seen_indices.append(_)
        
        for index in sorted(seen_indices, reverse=True):
            del RawData[index]
        
        print (RawData)
        

        【讨论】:

        • 在迭代列表时修改列表不被推荐,也不应该被推荐。它会带来不良影响。
        • @Ch3steR 是的,完全同意你的评论,我已经更新了代码。
        【解决方案4】:

        使用集合过滤掉已经看到键的条目是最有效的方法。

        这是一个使用带有内部副作用的列表推导式的单行示例:

        UniqueData = [rd for seen in [set()] for rd in RawData if not(rd[-1] in seen or seen.add(rd[-1])) ]
        

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 1970-01-01
          • 2013-12-16
          • 1970-01-01
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          相关资源
          最近更新 更多