比较两个列表中元素的有效方法?

时间:2016-07-19 21:21:30

标签: python

我知道这与Efficient way to compare elements in 2 lists类似,但基本上我对这个问题有一个扩展。

说我有两个清单:

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

我想找出a的索引,其中元素等于b的每个元素。

例如,我希望b[1]的示例输出告诉我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

如果有人有一些意见,我会非常感激!

由于

4 个答案:

答案 0 :(得分:2)

一个非常简单有效的解决方案是建立从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列表非常无用。

答案 1 :(得分:1)

如果b按照此处所示对连续整数进行排序,则桶排序最有效。 否则,您可以构造一个哈希表,将值b作为键,并构造一个列表作为值。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我不确定这是否足以满足您的需求,但这可行:

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)