Получение совпадающих значений элементов в двух массивах

#python #arrays

#python #массивы

Вопрос:

Если a бы и b были списками объектов, каждый со свойством name (например a1 = A("1") , b1 = B("1") , и т.д.), Как бы я проверил эквивалентность? В настоящее время я делаю это:

 aList = [ a1, a2, a3, a4, a5 ]
bList = [ b1, b2 ]
aNameList = []
bNameList = []

for i in aList:
    aNameList.append( i.name )
for i in bList:
    bNameList.append( i.name )

match = set(aNameList) amp; set(bNameList)

>>> set(['1', '2'])
 

Но это кажется довольно длинным и ненужным. Какой лучший способ сделать это?

Ответ №1:

Вместо этого вы можете использовать понимание списков, чтобы заменить эти временные списки и циклы for в вашем примере:

 match = set( [ x.name for x in aList ] ) amp; set ( [ x.name for x in bList ] )
 

Комментарии:

1. спасибо за комментарий, ваше право … мне пора ложиться спать (для будущих читателей я удалил свой комментарий)

2. set будет принимать генератор, поэтому квадратные скобки не нужны.

3. @KarlKnechtel Были бы квадратные скобки стилистически лучше или просто совершенно ненужными в целом?

4. Я бы счел, что стилистически лучше избавиться от них.

Ответ №2:

Функция operator.attrgetter была разработана для извлечения интересующих полей:

 set(map(attrgetter('name'), aList)) amp; set(map(attrgetter('name'), bList))
 

Ответ №3:

вы можете заменить понимание списка (заменив временные списки и цикл for) на map, например:

 name = lambda: n: n[name]
match = set(map(name,aList))amp;set(map(name,bList))