2015-03-26 3 views
0

Это вызвало серьезную головную боль сегодня. Предположим, у меня есть два экземпляра моего объекта, экземпляр A и экземпляр B. Они имеют свойства - это список. Скажем, два свойства для А являютсяСовместимость многомерного списка в python

a1 = [1, 2, 3, 4, 5] 
a2 = [10, 20, 30, 40, 50] 

и те, для B:

b1 = [5, 7, 3, 1] 
b2 = [50, 20, 30, 20] 

То, что я хочу, чтобы просто найти индексы в b1 и b2, где пара равна значения в a1 и a2 , Таким образом, в данном примере это будет индексы 0 и 2, так как для тех, у нас есть

b1[0] = 5 и b2[0] = 50

, которые мы находим в a1 и a2, как последние записи. То же самое для индекса 2, для которого мы находим (3, 30) в (b1, b2), который также находится в (a1, a2).

Обратите внимание, что списки a1 и a2 имеют одинаковую длину, а также b1 и b2.

Любая помощь?

ответ

4

Вы можете использовать комбинацию zip, set и enumerate:

>>> a1 = [1, 2, 3, 4, 5] 
>>> a2 = [10, 20, 30, 40, 50] 
>>> b1 = [5, 7, 3, 1] 
>>> b2 = [50, 20, 30, 20] 
>>> a12 = set(zip(a1, a2)) 
>>> [i for i, e in enumerate(zip(b1, b2)) if e in a12] 
[0, 2] 

С zip вы группируете пары вместе, и с помощью set вы превращаете их в набор, так как заказ не имеет значения, и у него есть более быстрый поиск. Затем enumerate дает вам пары индексов и элементов, и с помощью понимания списка вы получаете эти индексы от b12, чьи элементы находятся в a12.

+0

Это прекрасно работает, спасибо! – HansSnah

0

Я думаю, что другая структура будет лучше?

кортеж или набор ключей ...

а = [(1,10), (2,20)] и так далее

редактировать

хорошо .. . tobias_k показывает, как :)

0

Попробуйте

In [38]: [b1.index(i[0]) for i in zip(a1,a2) for j in zip(b1,b2) if i==j] 
Out[38]: [2, 0] 
+0

Не могли бы вы добавить некоторые объяснения, чтобы ОП мог понять ваш ответ? – Fiver

0

Существует также возможность проверки для каждого элемента (a1, a2), является ли это в (b1, b2), и он будет возвращать все матчи в списке и будет принимать заботиться о дубликатах:

a1 = [1, 2, 3, 4, 5] 
a2 = [10, 20, 30, 40, 50] 

b1 = [5, 7, 3, 1, 5] 
b2 = [50, 20, 30, 20, 50] 

# Construct list of tuples for easier matching 
pair_a = [(i, k) for i, k in zip(a1, a2)] 
pair_b = [(i, k) for i, k in zip(b1, b2)] 

# Get matching indices (for each entry in pair_a get the indices in pair_b) 
indices = [[i for i, j in enumerate(pair_b) if j == k] for k in pair_a] 

дает

[[], [], [2], [], [0, 4]] 
Смежные вопросы