子列表的唯一元素取决于子列表中的特定值

我试图从一个非常不一致的列表中选择唯一的数据集。我的数据集 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不起作用,因为项目不完全相同。

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


哈士奇WWW
浏览 93回答 4
4回答

开满天机

删除重复项的最佳方法是将它们添加到集合中。将最后一个元素添加到setas 以跟踪所有唯一值。当您要添加的值已经存在于集合中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']]

繁花如伊

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

米脂

使用集合过滤掉已经看到密钥的条目是最有效的方法。这是一个使用具有内部副作用的列表理解的单行示例:UniqueData = [rd for seen in [set()] for rd in RawData if not(rd[-1] in seen or seen.add(rd[-1])) ]

守候你守候我

    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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python