[英]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.