繁体   English   中英

嵌套列表中的列表理解

[英]list comprehensions in a nested list

我有两个清单

onnet_data = [['one', 'test'], ['two', 'test2'], ['three', 'test3'], ['four', 'test4'], ['five', 'test5']]
elastic_data = [['one', 'test'], ['three', 'test3'], ['six', 'test6'], ['seven', 'test7']]

我正在尝试比较onnet_data和elastic_data子列表中的第一个元素。 如果要匹配,我想从onnet_data中取出数据,作为common_data,然后在onnet_data中找到其余的列表项。

onnet = [onnet_data[i][0] for i in range(len(onnet_data))]
elastic = [elastic_data[i][0] for i in range(len(elastic_data))]

common = list(set(onnet)& set(elastic))
common_data = []
for i in range(len(common)):
    for j in range(len(onnet_data)):
        if common[i] == onnet_data[j][0]:
            common_data.append(onnet_data[j])

我试过像

from operator import ne
from functools import partial
onnet_remaining = list(filter(partial(ne, common_data), onnet_data))

onnet_remaining的预期输出为

[['two', 'test2'],  ['four', 'test4'], ['five', 'test5']]

但它会打印onnet_data的所有内容。 我不能使用list(set(onnet_data)-set(common_data)),因为它是嵌套列表。

有什么办法吗? 还有其他简便的方法,因为我的数据是len(onnet_data)= 69973和len(elastic_data)= 107730

更新:根据Roadrunner的回答,列表有些不同。

onnet_data = [['one', 'test'], ['two', 'test2'], ['three', 'test3'], ['four', 'test4'], ['five', 'test5']]
elastic_data = [['one', 'something'], ['three', 'some3'], ['six', 'some6'], ['seven', 'some7']]

您可以在此处使用简单的列表理解:

>>> [x for x in onnet_data if x not in elastic_data]
[['two', 'test2'], ['four', 'test4'], ['five', 'test5']]

但是,列表查找是使用in O(N) in对于较长的列表而言可能会很昂贵。 您可以将elastic_data转换为一组元组(列表不可散列)以获取O(1)查找:

>>> lookup = set(map(tuple, elastic_data))
>>> [x for x in onnet_data if tuple(x) not in lookup]
[['two', 'test2'], ['four', 'test4'], ['five', 'test5']]

在问题中更新后,如果要比较每个子列表中的第一个元素,则可以使用any()

>>> [[x, y] for x, y in onnet_data if not any(z == x for z, _ in elastic_data)]
[['two', 'test2'], ['four', 'test4'], ['five', 'test5']]

而且您还可以在这里使用集合来获取O(1)查找,因为使用any()O(N)

>>> from operator import itemgetter
>>> lookup = set(map(itemgetter(0), elastic_data))
>>> [[x, y] for x, y in onnet_data if x not in lookup]
[['two', 'test2'], ['four', 'test4'], ['five', 'test5']]

您可以进行列表理解:

from operator import itemgetter

onnet_data = [['one', 'test'], ['two', 'test2'], ['three', 'test3'], ['four', 'test4'], ['five', 'test5']]
elastic_data = [['one', 'test'], ['three', 'test3'], ['six', 'test6'], ['seven', 'test7']]

onnet_remaining = [datum for datum in onnet_data if datum[0] not in map(itemgetter(0), elastic_data)]

这有效

onnet_data = [['one', 'test'], ['two', 'test2'], ['three', 'test3'], ['four', 'test4'], ['five', 'test5']]
elastic_data = [['one', 'test'], ['three', 'test3'], ['six', 'test6'], ['seven', 'test7']]

filtered_list = [string for string in onnet_data if string not in elastic_data]  
print("filtered list:", filtered_list)

输出:

filtered list: [['two', 'test2'], ['four', 'test4'], ['five', 'test5']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM