嵌套列表中的列表理解

时间:2019-06-20 11:51:25

标签: python string nested-lists

我有两个列表

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']]

3 个答案:

答案 0 :(得分:3)

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

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

但是,列表搜索使用in O(N),对于较长的列表而言可能会很昂贵。您可以将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']]

答案 1 :(得分:1)

您可以进行列表理解:

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)]

答案 2 :(得分:0)

这有效

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']]