首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:在3个排序数组中获取公共值的索引

Python:在3个排序数组中获取公共值的索引
EN

Stack Overflow用户
提问于 2017-11-01 17:16:36
回答 3查看 129关注 0票数 0

我有三个排序数组:

代码语言:javascript
复制
>>> a = arange(10)
>>> b = arange(3,12)
>>> c = arange(-2,8)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> print(b)
[ 3  4  5  6  7  8  9 10 11]
>>> print(c)
[-2 -1  0  1  2  3  4  5  6  7]

我希望得到每个数组的元素的索引列表,这些索引也包含在所有其他数组中。

在本例中,每个数组中的索引将对应于数字3-7。

所以,就像:

代码语言:javascript
复制
a_inds, b_inds, c_inds = get_unq_inds(a,b,c)

a_inds = [3,4,5,6,7] (or [False, False, False,  True,  True,  True,  True,  True,  False,  False])

b_inds = [0,1,2,3,4] (or [True, True, True, True, True, False, False, False, False])

基本上,我想将这里提供的解决方案(在两个数组中查找公共值的索引)扩展到3个数组。(或者,如果你觉得雄心勃勃,'n‘数组)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-01 17:27:00

你可以这样做:

代码语言:javascript
复制
def get_unq_inds(a, b, c):
    uniq_vals = list(set(a).intersection(b).intersection(c))
    return [a.index(x) for x in uniq_vals], [b.index(x) for x in uniq_vals], [c.index(x) for x in uniq_vals]
    # you can use this for boolean values
    #return [x in uniq_vals for x in a], [x in uniq_vals for x in b], [x in uniq_vals for x in c]

输出

代码语言:javascript
复制
a_inds, b_inds, c_inds = get_unq_inds(range(9), range(3,12), range(-2,8))

>>> a_inds, b_inds, c_inds
([3, 4, 5, 6, 7], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9])

输出布尔值的

代码语言:javascript
复制
[False, False, False, True, True, True, True, True, False]
[True, True, True, True, True, False, False, False, False]
[False, False, False, False, False, True, True, True, True, True]

现场演示这里

票数 2
EN

Stack Overflow用户

发布于 2017-11-01 17:19:58

对于布尔人的列表,您可以使用列表理解。

代码语言:javascript
复制
a_inds = [x in b and x in c for x in a]
票数 1
EN

Stack Overflow用户

发布于 2017-11-01 17:28:28

您可以组合所有范围以获取set中的公共元素,然后对此进行测试:

代码语言:javascript
复制
>>> ranges = [range(9), range(3,12), range(-2,8)]
>>> s = set.intersection(*map(set,ranges))
>>> [[i for i,x in enumerate(sublist) if x in s] for sublist in ranges]
[[3, 4, 5, 6, 7], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

这将适用于任意数量的输入列表。

或者与@Ashish的想法类似地使用相同的s (注意,索引可能没有排序,因为我们正在迭代无序的set(),尽管在实践中,由于Python的整数的方式,它们很可能会保持顺序):

代码语言:javascript
复制
[[sublist.index(x) for x in s] for sublist in ranges]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47060280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档