Если у вас нет Python 2.6 или выше, альтернатива - написать явный цикл for:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
Вы также можете использовать reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
Однако многим программистам на Python это не нравится, включая самого Гвидо :
Около 12 лет назад Python приобрел лямбду-редукторы (Reduce (), Filter () и Map ()), любезно (я полагаю) хакер Lisp, который пропустил их и представил рабочие исправления Но, несмотря на значение PR, я думаю, что эти функции должны быть вырезаны из Python 3000.
Так что теперь уменьшаем (). Это на самом деле тот, который я всегда ненавидел больше всего, потому что, за исключением нескольких примеров, включающих + или *, почти каждый раз, когда я вижу вызову redu () с нетривиальным аргументом функции, мне нужно взять ручку и бумагу, чтобы представьте диаграмму, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать redu (). Поэтому, на мой взгляд, применимость метода limit () в значительной степени ограничена ассоциативными операторами, и во всех других случаях лучше выписать цикл накопления явно.