从 2D 列表中删除连续重复项,python?

     2023-02-25     37

关键词:

【中文标题】从 2D 列表中删除连续重复项,python?【英文标题】:Remove consecutive duplicates from a 2D list , python? 【发布时间】:2014-04-19 21:15:43 【问题描述】:

如何根据特定元素(在本例中为第二个元素)从 2d 列表中删除连续重复项。

我尝试了一些与 itertools 的组合,但没有运气。

谁能建议我如何解决这个问题?

输入


192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 16
192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 17
192.168.1.232  >>>>>   173.194.36.119 , 23 , 30 , 31
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 41
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 62
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 43
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 65
192.168.1.232  >>>>>   173.194.36.74 , 26 , 44 , 45
192.168.1.232  >>>>>   173.194.36.74 , 26 , 44 , 66
192.168.1.232  >>>>>   173.194.36.78 , 27 , 46 , 47

输出


192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 16
192.168.1.232  >>>>>   173.194.36.119 , 23 , 30 , 31
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 41
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 43
192.168.1.232  >>>>>   173.194.36.78 , 27 , 46 , 47

这是预期的输出。

更新


上面给出的是一个打印得很好的列表形式。

实际列表如下所示。

>>> for x  in connection_frame:
    print x


['192.168.1.232', '173.194.36.64', 14, 15, 16]
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 41]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 25, 42, 43]
['192.168.1.232', '173.194.36.74', 25, 42, 65]
['192.168.1.232', '173.194.36.74', 26, 44, 45]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 27, 46, 47]
['192.168.1.232', '173.194.36.78', 27, 46, 67]
['192.168.1.232', '173.194.36.78', 28, 48, 49]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 51]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 53]
['192.168.1.232', '173.194.36.119', 32, 52, 74]

【问题讨论】:

看看itertools.groupby 您只需将它们打成一组即可删除重复项 您使用的实际数据类型是什么。这些行是字符串、元组等吗? 我也相信 OP 只希望删除与某些其他元素重复的元素。不仅仅是没有重复。 @thecreator232,如果顺序无关紧要,我们怎么能有有意义的连续条目? 【参考方案1】:

所以因为你想保持顺序并且只弹出连续的条目,我不知道你可以使用任何花哨的内置。所以这里是“蛮力”方法:

>>> remList = []
>>> for i in range(len(connection_frame)):
...     if (i != len(connection_frame)-)1 and (connection_frame[i][1] == connection_frame[i+1][1]):
...         remList.append(i)
...
for i in remList:
    connection_frame.pop(i)
['192.168.1.232', '173.194.36.119', 32, 52, 53]
['192.168.1.232', '173.194.36.79', 29, 50, 51]
['192.168.1.232', '173.194.36.78', 28, 48, 49]
['192.168.1.232', '173.194.36.78', 27, 46, 67]
['192.168.1.232', '173.194.36.78', 27, 46, 47]
['192.168.1.232', '173.194.36.74', 26, 44, 45]
['192.168.1.232', '173.194.36.74', 25, 42, 65]
['192.168.1.232', '173.194.36.74', 25, 42, 43]
['192.168.1.232', '173.194.36.98', 24, 40, 41]
['192.168.1.232', '173.194.36.64', 14, 15, 16]
>>>
>>> for conn in connection_frame:
...     print conn
...
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 74]
>>>

或者,如果您想通过列表理解一次性完成所有操作:

>>> new_frame = [conn for conn in connection_frame if not connection_frame.index(conn) in [i for i in range(len(connection_frame)) if (i != len(connection_frame)-1) and (connection_frame[i][1] == connection_frame[i+1][1])]]
>>>
>>> for conn in new_frame:
...     print conn
...
['192.168.1.232', '173.194.36.64', 14, 15, 17]
['192.168.1.232', '173.194.36.119', 23, 30, 31]
['192.168.1.232', '173.194.36.98', 24, 40, 62]
['192.168.1.232', '173.194.36.74', 26, 44, 66]
['192.168.1.232', '173.194.36.78', 28, 48, 68]
['192.168.1.232', '173.194.36.79', 29, 50, 69]
['192.168.1.232', '173.194.36.119', 32, 52, 74]

【讨论】:

@thecreator232,你需要改变什么?让我知道,以便我可以在这里更新它 'if (connection_frame[i][1] == connection_frame[i+1][1]) and (connection_frame[i][2] == connection_frame[i+1][2] ) : connection_frame.remove(connection_frame[i+1])' @thecreator232 好的,我明白你在做什么。在您迭代列表时,我会小心更改列表,您可能会得到一些奇怪的结果,而且它通常被认为是糟糕的形式,所以我不会在这里更改它 感谢您的提醒。【参考方案2】:

使用itertools.groupby():

import itertools

data = """192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 16
192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 17
192.168.1.232  >>>>>   173.194.36.119 , 23 , 30 , 31
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 41
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 62
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 43
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 65
192.168.1.232  >>>>>   173.194.36.74 , 26 , 44 , 45
192.168.1.232  >>>>>   173.194.36.74 , 26 , 44 , 66
192.168.1.232  >>>>>   173.194.36.78 , 27 , 46 , 47""".split("\n")

for k, g in itertools.groupby(data, lambda l:l.split()[2]):
  print next(g)

打印出来

192.168.1.232  >>>>>   173.194.36.64 , 14 , 15 , 16
192.168.1.232  >>>>>   173.194.36.119 , 23 , 30 , 31
192.168.1.232  >>>>>   173.194.36.98 , 24 , 40 , 41
192.168.1.232  >>>>>   173.194.36.74 , 25 , 42 , 43
192.168.1.232  >>>>>   173.194.36.78 , 27 , 46 , 47

(这使用了一个字符串列表,但很容易适应列表列表。)

【讨论】:

如果 OP 的数据结构确实是字符串列表,则此方法有效,但他只是表示它可能是字符串列表(可能是 [['192.168.1.1', '>>>>', ...], ...],这会使答案稍微复杂一些。是的,它绝对会删除不连续的重复项。 @aruisdante:答案末尾有一条关于此的评论(您可能需要重新加载才能看到它)。 是的,看到它,但这将删除不连续的重复,这不是 OP 想要的。 @aruisdante:不,这不会删除不连续的重复项。我在这里错过了什么吗? @aruisdante:如果data 是列表列表,那么它是相同的:result = (next(g) for _, g in groupby(data, key=lambda x: x[1]))【参考方案3】:

Pandas.groupbyitertools.groupby 的替代品,它还允许您跟踪原始列表的连续/非连续元素 --- 通过提供行号而不是迭代器。像这样的:

df = pandas.DataFrame(connection_frame)
print df
Out:
                0                  1    2    3    4
0   '192.168.1.232'    '173.194.36.64'   14   15   16
1   '192.168.1.232'    '173.194.36.64'   14   15   17
2   '192.168.1.232'   '173.194.36.119'   23   30   31
3   '192.168.1.232'    '173.194.36.98'   24   40   41
4   '192.168.1.232'    '173.194.36.98'   24   40   62
5   '192.168.1.232'    '173.194.36.74'   25   42   43
6   '192.168.1.232'    '173.194.36.74'   25   42   65
7   '192.168.1.232'    '173.194.36.74'   26   44   45
8   '192.168.1.232'    '173.194.36.74'   26   44   66
9   '192.168.1.232'    '173.194.36.78'   27   46   47
10  '192.168.1.232'    '173.194.36.78'   27   46   67
11  '192.168.1.232'    '173.194.36.78'   28   48   49
12  '192.168.1.232'    '173.194.36.78'   28   48   68
13  '192.168.1.232'    '173.194.36.79'   29   50   51
14  '192.168.1.232'    '173.194.36.79'   29   50   69
15  '192.168.1.232'   '173.194.36.119'   32   52   53
16  '192.168.1.232'   '173.194.36.119'   32   52   74

然后,您可以按第二列对它们进行分组并将组打印为

gps = df.groupby(2).groups
print gps
Out: 
' 14': [0, 1],
 ' 23': [2],
 ' 24': [3, 4],
 ' 25': [5, 6],
 ' 26': [7, 8],
 ' 27': [9, 10],
 ' 28': [11, 12],
 ' 29': [13, 14],
 ' 32': [15, 16]

查看各个行号?有很多方法可以删除gps 的每个列表中的连续重复项。这是一个:

valid_rows = list()
for g in gps.values():
   old_row = g[0]
   valid_rows.append(old_row)
   for row_id in range(1, len(g)):
      new_row = g[row_id]
      if new_row - old_row != 1:
         valid_rows.append(new_row)
      old_row = new_row
 print valid_rows
 Out: [5, 3, 9, 7, 0, 2, 15, 13, 11]

最后,通过valid_rows 索引pandas DataFrame。

print df.ix[sorted(valid_rows)]
Out:


0   '192.168.1.232'    '173.194.36.64'   14   15   16
2   '192.168.1.232'   '173.194.36.119'   23   30   31
3   '192.168.1.232'    '173.194.36.98'   24   40   41
5   '192.168.1.232'    '173.194.36.74'   25   42   43
7   '192.168.1.232'    '173.194.36.74'   26   44   45
9   '192.168.1.232'    '173.194.36.78'   27   46   47
11  '192.168.1.232'    '173.194.36.78'   28   48   49
13  '192.168.1.232'    '173.194.36.79'   29   50   51
15  '192.168.1.232'   '173.194.36.119'   32   52   53

【讨论】:

从 Python 列表中删除重复项

】从Python列表中删除重复项【英文标题】:RemovingduplicatesfromlistoflistsinPython【发布时间】:2009-07-1713:45:48【问题描述】:如果想根据每个嵌套列表的第一个元素评估重复项,谁能提出一个从嵌套列表中删除重复项的好解决方案?... 查看详情

python从列表中删除重复项(代码片段)

查看详情

如何从 Python 列表中删除重复项并保持顺序? [复制]

】如何从Python列表中删除重复项并保持顺序?[复制]【英文标题】:HowtoremoveduplicatesfromPythonlistandkeeporder?[duplicate]【发布时间】:2010-10-0313:18:03【问题描述】:给定一个字符串列表,我想按字母顺序对其进行排序并删除重复项。... 查看详情

如何有效地删除列表列表中的连续重复项?

】如何有效地删除列表列表中的连续重复项?【英文标题】:Howtodeleteconsecutiveduplicatesinalistoflistsefficiently?【发布时间】:2019-08-1305:12:27【问题描述】:我有一个嵌套列表:l=[[\'GILTI\',\'was\',\'intended\',\'to\',\'to\',\'stifle\',\'multinationa... 查看详情

将连续重复项变为一个值(Python)

...on)【发布时间】:2022-01-1405:00:00【问题描述】:我在删除列表中的连续重复项而不删除所有重复项时遇到问题。假设我有一个清单,a=[3,3,3,4,10,11,3,3,5,5,10]我想要做的是,只要一行中有重复项,该重复项就会更改为单个值。我希... 查看详情

使用 Python 删除对象列表中的重复项

】使用Python删除对象列表中的重复项【英文标题】:RemoveduplicatesinlistofobjectwithPython【发布时间】:2011-05-0907:53:13【问题描述】:我有一个对象列表,我有一个充满记录的数据库表。我的对象列表具有标题属性,我想从列表中删... 查看详情

使用python从不同长度的元组列表中删除重复项

】使用python从不同长度的元组列表中删除重复项【英文标题】:Removeduplicatesfromalistoftuplesofdifferentlengthwithpython【发布时间】:2019-01-0313:00:43【问题描述】:我使用正则表达式等从文本中提取特定名称。结果是包含标题和名称的元... 查看详情

从列表中删除重复项?

】从列表中删除重复项?【英文标题】:removeduplicatesfromList?【发布时间】:2021-04-0210:20:15【问题描述】:我从适配器中的API获取重复项,但我想从我的适配器中删除这些重复项,并在知道如何打印后将其打印出来?提前致谢。... 查看详情

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

】在Python中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥?[复制]【英文标题】:InPython,whatisthefastestalgorithmforremovingduplicatesfromalistsothatallelementsareunique*whilepreservingorder*?[duplicate]在Python中,从列表... 查看详情

删除列表中连续重复元素的优雅方法[关闭]

】删除列表中连续重复元素的优雅方法[关闭]【英文标题】:Elegantwaytoremovecontiguousrepeatedelementsinalist[closed]【发布时间】:2011-11-3007:32:58【问题描述】:我正在寻找一种干净的Pythonic方法来从以下列表中删除:li=[0,1,2,3,3,4,3,2,2,2,1,0... 查看详情

如何使用列表理解从列表中删除重复项? [复制]

】如何使用列表理解从列表中删除重复项?[复制]【英文标题】:Howtoremoveduplicateitemsfromalistusinglistcomprehension?[duplicate]【发布时间】:2012-05-1922:21:07【问题描述】:如何使用列表推导从列表中删除重复项?我有以下代码:a=[1,2,3,3,... 查看详情

java示例代码_从列表中删除重复项

java示例代码_从列表中删除重复项 查看详情

如何从Java列表中删除重复项

】如何从Java列表中删除重复项【英文标题】:HowtoremoveduplicatesfromSetoflistinJava【发布时间】:2021-12-1314:38:04【问题描述】:我有一组列表,我想从无论每个列表中的元素顺序如何删除重复项,如下所示:我有这个作为输入[[-1,-1,2]... 查看详情

从 Ocaml 中的列表列表中删除重复项?

】从Ocaml中的列表列表中删除重复项?【英文标题】:RemovingduplicatesfromalistoflistsinOcaml?【发布时间】:2021-07-0120:24:42【问题描述】:我是Ocaml的新手,我被分配仅使用List模块删除列表列表的所有重复项。这是我写的代码:letsort_an... 查看详情

如何从我的列表中删除重复项? [复制]

】如何从我的列表中删除重复项?[复制]【英文标题】:HowcanIremoveduplicatesfrommylist?[duplicate]【发布时间】:2021-06-3014:16:05【问题描述】:我正在使用SwiftUI在视图中生成这个动态列表(显示生成列表的一部分):薰衣草柠檬石灰石... 查看详情

使用 Guava 从列表中删除重复项

】使用Guava从列表中删除重复项【英文标题】:RemoveduplicatesfromListusingGuava【发布时间】:2012-08-2720:23:51【问题描述】:我们如何在Guavaapi的帮助下从List中删除重复项?目前我正在关注这个:privateList<T>removeDuplicate(List<T>li... 查看详情

如何从列表 Dart 中删除重复项 |扑

】如何从列表Dart中删除重复项|扑【英文标题】:HowtoDeleteduplicateitemsfromaListDart|Flutter【发布时间】:2021-12-1015:56:34【问题描述】:我有一套物品。从这里我想删除所有重复的值。我试过这个finalList=[......users!];和这个print(users.toSet... 查看详情

从列表中删除(并计算)重复项

】从列表中删除(并计算)重复项【英文标题】:remove(andcount)duplicatesfromalist【发布时间】:2022-01-2022:45:34【问题描述】:是否可以在同一个列表的两个迭代器之间进行迭代并删除嵌套迭代器中的一个项目?版本1(不起作用):... 查看详情