当前位置: 首页 > 面试题库 >

根据每个子列表中的第三项删除列表中的重复项

朱鹤轩
2023-03-14
问题内容

我有一个列表列表,看起来像:

c = [['470', '4189.0', 'asdfgw', 'fds'],
     ['470', '4189.0', 'qwer', 'fds'],
     ['470', '4189.0', 'qwer', 'dsfs fdv'] 
      ...]

c有大约30,000个内部清单。我想做的是根据每个内部列表的第4个项目消除重复项。因此,上面的列表列表如下所示:

c = [['470', '4189.0', 'asdfgw', 'fds'],['470', '4189.0', 'qwer', 'dsfs fdv'] ...]

这是我到目前为止的内容:

d = [] #list that will contain condensed c
d.append(c[0]) #append first element, so I can compare lists
for bact in c: #c is my list of lists with 30,000 interior list
    for items in d:
        if bact[3] != items[3]:
            d.append(bact)

我认为这应该可行,但它会不断运行。我让它运行30分钟,然后将其杀死。我认为程序不需要花那么长时间,所以我猜我的逻辑有问题。

我觉得创建一个全新的列表列表非常愚蠢。任何帮助将不胜感激,请随时随地学习。如果不正确,请更正我的词汇。


问题答案:

我会这样:

seen = set()
cond = [x for x in c if x[3] not in seen and not seen.add(x[3])]

说明:

seen是一个跟踪每个子列表中第四个元素的集合。
cond是精简清单。如果x[3](其中x的子列表中的c)不在其中seenx则将添加到中cond并将x[3]添加到中seen

seen.add(x[3])将返回None,所以not seen.add(x[3])总是会True,但如果这部分将只进行评估x[3] not in seenTrue因为Python使用短路评价。如果第二个条件得到评估,它将始终返回True并具有添加x[3]到的副作用seen。这是正在发生的事情的另一个示例(print返回None并具有打印某些内容的“副作用”):

>>> False and not print('hi')
False
>>> True and not print('hi')
hi
True


 类似资料:
  • 问题内容: 鉴于: 我想删除第一个项目中的那个项目。因此,在这种情况下,我们将删除以: 我当前的代码是: 这可行,但是很慢。什么是更好的方法呢? 编辑:我之前没有测试过性能,所以我可能做错了,但是我得到了: 问题答案: 反向删除,就地修改: 就地修改意味着这样做效率更高,因为它不会创建新列表(如列表理解那样)。 由于OP要求提供高效的解决方案,因此这里比较了两个投票最高的答案。 设定 - 清单理解

  • 问题内容: 编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道​​该怎么办。 问题答案: 获取唯一项目集合的常用方法是使用。集是不同对象的无序集合。要从任何迭代创建集合,只需将其传递给内置函数即可。如果以后再次需要真实列表,则可以类似地将集合传递给函数。 以下示例应涵盖你尝试做的所有事情: 从示例结果中可

  • 问题内容: 我在Python中有一个列表列表: 我想从中删除重复的元素。如果这是正常列表,而不是我可以使用的列表set。但不幸的是,该列表不可散列,因此无法建立一组列表。只有元组。因此,我可以将所有列表转换为元组,然后使用set并返回列表。但这不是很快。 如何以最有效的方式做到这一点? 上面的结果应为: 我不在乎保留订单。 注意:这个问题很相似,但不是我所需要的。搜索了SO,但没有找到确切的重复项

  • 问题内容: 如果想基于每个嵌套列表的第一个元素评估重复项,谁能提出一个好的解决方案从嵌套列表中删除重复项? 主列表如下所示: 如果已经在第一位置出现了另一个具有相同元素的列表,那么我想删除该列表并得到以下结果: 您可以建议一种算法来实现此目标吗? 问题答案: 您是否关心保留订单/删除了哪些重复项?如果不是,则: 会做的。如果您想保留订单并想保留第一个订单,则:

  • 问题内容: 我有两个列表需要合并,第二个列表忽略了第一个列表的重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。 您会注意到结果具有第一个列表, 包括 其两个“ 2”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。 通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实

  • 问题内容: 我有这张桌子,我想用SELECT来排除标记的行。一般规则是: 如果有两行或更多行,控件名与品牌名与组类型列相等 然后保留组名不是“ Keine Zuordnung”的行。 请给我一点帮助吗?谢谢! 问题答案: 这是一种方法: 它使用窗口函数来获取计数,然后使用a进行逻辑计算。