簡體   English   中英

Python比較列表列表

[英]Python comparing list of lists

我有一個包含10 ** 7個列表的列表,格式為:

big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]

每個列表包含6個唯一的整數。

我需要將每個列表與另一個列表進行比較:

lst = [1, 3, 4, 10, 23, 46]

並返回列表項交點小於3的那些。因此,新列表將是:

new_list = [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]

目前,我正在使用設置交集,但是運行大約需要30秒

import numpy as np
biglist = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
oldlist = [1, 3, 4, 10, 23, 46]

b = np.array(biglist)
b[np.array([(b == x).any(axis=1) for x in oldlist]).sum(axis=0) < 3]

回報

array([[ 2,  3,  4,  5,  6,  7],
       [ 2,  3,  4, 26, 33, 40]])

創建numpy數組需要花費一些時間,但是最后一行大約是具有集合交集的列表理解速度的兩倍(對於1e6列表)。

編輯:下一行比我上面的代碼更快,並且需要更少的內存:

b[reduce(np.add, ((b == x).any(axis=1).astype(np.int) for x in oldlist)) < 3]
>>> big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
>>> normal = set([1, 3, 4, 10, 23, 46])
>>> [x for x in big_list if len(set(x).intersection(normal)) < 3]
[[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]

我認為“快速”解決方案應取決於您問題的規格。 例如,如果您的參考列表短於[1、3、4、10、23、46],則通過對每個列表進行排序,我們可以立即看到所有以大於10的數字開頭的列表,例如[ 11,x,x,...]的引用最多包含3個公共元素。 那可能已經節省了很多比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM