簡體   English   中英

比較兩個列表中元素的有效方法?

[英]Efficient way to compare elements in two lists?

我知道這類似於比較2個列表中元素的有效方式 ,但是我對這個問題有一個擴展。

說我有兩個清單:

a = [1,2,4,1,0,3,2]
b = [0,1,2,3,4]

我想找出的指標a其中元素等於每個元素b

例如,我想讓b[1]的樣本輸出告訴我[0,3]a = b[1] [0,3]

數據幀輸出也將很有用,例如:

   b  index_a
   0     4
   1     0
   1     3
   2     1
   2     6
   3     5
   4     3

我以前使用的是:

b = pd.DataFrame(b)
a = pd.DataFrame(a)
pd.merge(b.reset_index(),a.reset_index(),
         left_on=b.columns.tolist(),
         right_on = a.columns.tolist(),
         suffixes = ('_b','_a'))['index_b','index_a']]

但是,我不確定這是否必要,因為這些是用於列表的。 (我以前在處理數據框時使用了此方法)。

我正在使用更大的列表執行此操作數千次,所以我想知道是否有更有效的方法。

另外,b只是list(range(X)) ,在這種情況下X = 5

如果有人有什么意見,我將不勝感激!

謝謝

一個非常簡單有效的解決方案是建立一個從0..N-1范圍內的值到a索引的映射。 映射可以是一個簡單的列表,因此您最終得到:

indices = [[] for _ in b]
for i, x in enumerate(a):
    indices[x].append(i)

示例運行:

>>> a = [1,2,4,1,0,3,2]
>>> b = [0,1,2,3,4]
>>> indices = [[] for _ in b]
>>> for i,x in enumerate(a):
...     indices[x].append(i)
... 
>>> indices[1]
[0, 3]

注意b[i] == i因此保留b列表是毫無用處的。

如果b如此處所示是對連續整數進行排序,則存儲桶排序最有效。 否則,您可以構造一個哈希表,將值b作為鍵,並構造a的列表作為值。

import collections
dd=collections.defaultdict(list)
for i,x in enumerate(a):
    dd[x].append(i)

>>> sorted(dd.items())
[(0, [4]), (1, [0, 3]), (2, [1, 6]), (3, [5]), (4, [2])]

我不確定這是否足夠滿足您的需求,但這可以工作:

from collections import defaultdict

indexes = defaultdict(set)

a = [1,2,4,1,0,3,2]
b = [0,1,2,3,4]

for i, x in enumerate(a):
    indexes[x].add(i)

for x in b:
    print b, indexes.get(x)

暫無
暫無

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

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