【问题标题】:Find common elements in multiple lists and delete data if they match in Python在多个列表中查找公共元素,如果它们在 Python 中匹配,则删除数据
【发布时间】:2019-11-19 13:31:05
【问题描述】:

我有一个包含很多页面的文档,我正在尝试提取每页的前 3 行。

我这样做,我的输出是多个列表,例如:

['hello','','data']
['hello','','data']
['test','','data']

我想删除任何匹配的列表,例如,第 1 页和第 2 页有相同的 3 行。我想从相关页面的原始文档中删除这 3 行。我该怎么做呢?

到目前为止,我已经尝试过使用集合和交集功能。示例:

for item in line_list:
    common = list(set(line_list[0]).intersection(line_list[2:]))
    print (common)

我在这里得到的只是空列表。我认为这可能是我的语法,但不确定。谁能给点建议?

【问题讨论】:

  • 您只想保留 ['hello','','data'], ['test','','data']?无法真正理解您要实现的目标
  • 不,我想从我的整页数据中删除常用列表。因此,如果没有带有['test','','data'] 的公共页面,则此列表可以保留,并且循环将检查文档的下一页

标签: python list set


【解决方案1】:

set.intersection 不采用可迭代的可迭代对象(看起来您正在尝试传递),但它确实允许任意数量的参数,它期望是可迭代对象。

试试:

common = list(set(line_list[0]).intersection(*line_list[2:]))

Google 搜索“splat operator python”,了解更多关于 * 作用的信息。

【讨论】:

  • 这可能无法回答您总体上想要做的事情,但它应该向您表明set.intersection 的正确用法,以便至少您可以正确评估它在您的特定情况下的有用性。
【解决方案2】:

python 中有一个名为set 的函数,它返回具有唯一值或列表元组的集合。问题是您有一个列表列表。因此,为了做到这一点,您必须将列表转换为元组,然后使用 set 获取唯一列表,然后再次将其转换为列表。这就是你的做法:

a = ['hello','','data']
b = ['hello','','data']
c = ['test','','data']

common = [list(x) for x in set(tuple(x) for x in [a, b, c])]

【讨论】:

    【解决方案3】:

    假设您知道重复的位置,您可以以智能的方式进行切片以消除冗余。 您可以使用 readlines() 命令:

    lines_without_redundancy = all_lines[3::]

    【讨论】:

    • 这种方法并非在所有情况下都有效,只有在您确切知道副本在哪里的情况下。
    • 正如我在回答中提到的:'假设您知道副本在哪里[...]',您当然可以让它工作。
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多