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