我有一个带有一些重复元素的叮咬列表,我希望将它们组合成一个较短的列表。
原始列表内容如下所示:
lst = [['0.1', '0', 'RC', '100'],
['0.2', '10', 'RC', '100'],
['0.3', '5', 'HC', '20'],
['0.4', '5', 'HC', '20'],
['0.5', '5', 'HC', '20'],
['0.6', '5', 'HC', '20'],
['0.7', '5', 'HC', '20'],
['0.8', '5', 'HC', '20'],
['0.9', '10', 'RC', '100'],
['1.0', '0', 'RC', '100']]
通过该功能运行后,它将成为:
lst = [['0.1', '0', 'RC', '100'],
['0.2', '10', 'RC', '100'],
['0.3', '5', 'HC', '20'],
['0.9', '10', 'RC', '100'],
['1.0', '0', 'RC', '100']]
列表总是具有这种通用结构,所以基本上我想根据最后3列是否完全相同来组合列表。
我希望它是一个可调用的函数,所以它看起来像:
def combine_list(lst):
if sublist[1:3] == next_sublist[1:3]:
let.remove(next_sublist)
我对此的初步研究显示了许多基于其索引删除子列表的方法,但这不一定是事先知道的。我也找到了re模块,但是我从未使用它并且不确定如何实现它。先谢谢你了
答案 0 :(得分:6)
如果要删除最后三个元素和连续相同的子列表,则需要itertools.groupby
键入最后三个元素:
from itertools import groupby
[next(g) for _, g in groupby(lst, key=lambda x: x[1:])]
#[['0.1', '0', 'RC', '100'],
# ['0.2', '10', 'RC', '100'],
# ['0.3', '5', 'HC', '20'],
# ['0.9', '10', 'RC', '100'],
# ['1.0', '0', 'RC', '100']]
答案 1 :(得分:2)
也许只是使用一套来跟踪重复项?
def combine_list(lst):
out = []
seen = set()
for item in lst:
if not tuple(item[1:]) in seen:
out.append(item)
seen.add(tuple(item[1:]))
return out
列表是一种可变数据结构。因此无法保证列表内容不会随时间而变化。这意味着它不能用于散列函数(集合使用)。另一方面,元组是不可变的,因此可以使用。
答案 2 :(得分:2)
for index in range(len(lst) - 1, 0, -1):
if lst[index][1:] == lst[index - 1][1:]:
lst.pop(index)
通过向后浏览列表,我们删除了在删除元素时索引发生变化的问题。这导致就地减少。
如果您想创建一个新列表,可以按照相同的想法通过列表理解来完成,但由于我们没有这样做,我们不必反向工作:
lst[0] + [lst[ind] for ind in range(1, len(lst)) if lst[ind][1:] != lst[ind-1][1:]]
同样,lst[0]
非常重复,因此会自动包含在内。
答案 3 :(得分:0)
def combine_list(ls):
cpy = ls[:]
for i, sub in enumerate(ls[:len(ls) - 1]):
if sub[1:] == ls[i + 1][1:]:
cpy.remove(ls[i + 1])
return cpy
此功能应该有效。它会创建列表的新副本,以避免修改原始列表。然后它迭代原始列表(最后一个值除外),因为它保持不变。
然后检查列表的最后一个值是否等于下一个列表的最后一个值。如果是,则删除下一个列表。
然后该函数返回新列表。