【问题标题】:Remove duplicates from a list of lists based on duplicate first elements [closed]根据重复的第一个元素从列表列表中删除重复项[关闭]
【发布时间】:2020-10-15 07:41:26
【问题描述】:

数据在下面

data = [["'id'", "'state'", "'country'\n"],
        ['44', "'WD'", "'India'\n"],
        ['5', "'WD'", "'India'\n"],
        ['44', "'WD'", "'Japan'\n"],
        ['390', "'WD'", "'Japan'\n"],
        ['17', "'WD'", "'Japan'\n"],
        ['17', "'WD'", "'BEL'"]]

如何去除id中的重复元素。

这里 44, 17 id 重复

预期

[["'id'", "'state'", "'country'\n"]
['44', '1', "'WD'", "'India'\n"]
['5', "'WD'", "'India'\n"]
['390', "'WD'", "'Japan'\n"]
['17', "'WD'", "'Japan'\n"]]

伪代码

l = []

for i in range(len(a)):
    print (a[i])
    if i[0] == a[i][1]:
        pass
    else:
        l.append(i)

【问题讨论】:

  • 你运行你的“伪”代码了吗?发生了什么?
  • @jonrsharpe 是的,它不会删除,因为我没有做柜台工作
  • 你说的“我没有做柜台工作”是什么意思?!
  • 伪代码无效,因为 i 是整数,因此 i[0] 会抛出异常
  • @jonrsharpe 首先是 i=0,1,2,3,4,5,6 的逻辑,取第一个列表取第一个元素,如果重复删除,则检查 id 重复的整个列表.

标签: python list


【解决方案1】:

您可以在此处使用dict

unique_data = {}

for sub_data in data:
    sub_data_id = sub_data[0]

    if sub_data_id not in unique_data:
        unique_data[sub_data_id] = sub_data

unique_data 的结构会是这样的:

{
    "'id'": ["'id'", "'state'", "'country'"], 
    '44': ['44', '1', "'WD'", "'India'"], 
    '5': ['5', "'WD'", "'India'"], 
    '390': ['390', "'WD'", "'Japan'"], 
    '17': ['17', "'WD'", "'Japan'"]
}

然后要获得独特的物品,我们可以使用list(unique_data.values()),它给了我们:

[["'id'", "'state'", "'country'"], ['44', '1', "'WD'", "'India'"], ['5', "'WD'", "'India'"], ['390', "'WD'", "'Japan'"], ['17', "'WD'", "'Japan'"]]

【讨论】:

    【解决方案2】:

    这可能有点矫枉过正,但您可以使用itertools.groupby 来解决它。 groupby 键 x[0] 即列表中的第一个元素,然后从分组值中获取第一个值。

    from itertools import groupby
    data = [["'id'", "'state'", "'country'\n"], ['44', '1', "'WD'", "'India'\n"], ['5', "'WD'", "'India'\n"], ['44', "'WD'", "'Japan'\n"], ['390', "'WD'", "'Japan'\n"], ['17', "'WD'", "'Japan'\n"], ['17', "'WD'", "'BEL'"]]
    key_function = lambda x : x[0]
    data.sort(key=key_function)
    result = [ list(values) [0] for _,values in groupby(data,key=key_function) ]
    print(result)
    

    输出

    [["'id'", "'state'", "'country'\n"], ['17', "'WD'", "'Japan'\n"], ['390', "'WD'", "'Japan'\n"], ['44', '1', "'WD'", "'India'\n"], ['5', "'WD'", "'India'\n"]]
    

    【讨论】:

    • 好的,如果 OP 不关心列表顺序。
    【解决方案3】:
    
    data = [["'id'", "'state'", "'country'\n"], ['44', '1', "'WD'", "'India'\n"], ['5', "'WD'", "'India'\n"], ['44', "'WD'", "'Japan'\n"], ['390', "'WD'", "'Japan'\n"], ['17', "'WD'", "'Japan'\n"], ['17', "'WD'", "'BEL'"]]
    
    ls={}
    for each  in data:
        if not each[0] in ls:
            ls[each[0]] = each[1:len(each)]
    
    print(ls)
    {"'id'": ["'state'", "'country'\n"],
       '44': ['1', "'WD'", "'India'\n"],
       '5': ["'WD'", "'India'\n"], 
       '390': ["'WD'", "'Japan'\n"], 
       '17': ["'WD'", "'Japan'\n"]}
        
    
    ourlist = [[k]+v for k,v in ls.items()]
    
    print(ourlist)
    
    [["'id'", "'state'", "'country'\n"], 
    ['44', '1', "'WD'", "'India'\n"],
    ['5', "'WD'", "'India'\n"],
    ['390', "'WD'", "'Japan'\n"],
    ['17', "'WD'", "'Japan'\n"]]
    

    【讨论】:

      【解决方案4】:

      当您处理这些类型的数据时,最好使用 Pandas。您获得了灵活性和速度,避免了不必要的循环。

      data = [["'id'", "'state'", "'country'\n"],
              ['44', "'WD'", "'India'\n"],
              ['5', "'WD'", "'India'\n"],
              ['44', "'WD'", "'Japan'\n"],
              ['390', "'WD'", "'Japan'\n"],
              ['17', "'WD'", "'Japan'\n"],
              ['17', "'WD'", "'BEL'"]]
                 
      import pandas as pd
      df = pd.DataFrame(data[1:],columns = data[0])
      print(df.drop_duplicates(subset="'id'"))
      

      输出:

          'id' 'state' 'country'\n
      0   44    'WD'   'India'\n
      1    5    'WD'   'India'\n
      3  390    'WD'   'Japan'\n
      4   17    'WD'   'Japan'\n
      

      【讨论】:

        【解决方案5】:

        一个简单的解决方案是将值放入字典中,其中 id 为键。然后你可以简单地取值。

        例子:

        data_dict = {elt[0]: elt for elt in reversed(data)}
        unique_data = list(data_dict.values())
        print(unique_data)
        

        如果您想保留订单,可以改用OrderedDict

        【讨论】:

        • 这将不符合OP对删除第一项后重复项的要求,这将删除最后一项之前的重复项。我认为您可以通过迭代 reversed(data) 来满足此要求。
        • @MarioIshac 你是对的
        猜你喜欢
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2019-12-29
        • 2021-03-20
        • 2016-01-09
        相关资源
        最近更新 更多