Если у вас нет Python 2.6 или выше, альтернатива, чтобы написать явный цикл:
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 не нравится, including Guido himself:
Около 12 лет назад Python приобрел лямбда, уменьшил() , filter() и map(), любезно предоставленный (я считаю) хакер Lisp, который пропустил их и представил рабочие исправления. Но, несмотря на ценность PR, я думаю, что эти функции должны быть вырезаны из Python 3000.
Теперь теперь уменьшите(). Это на самом деле тот, которого я всегда ненавидел больше всего, потому что, помимо нескольких примеров с участием + или *, почти каждый раз, когда я вижу вызов reduce() с нетривиальным аргументом функции, мне нужно захватить ручку и бумагу диаграмму, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать метод reduce(). Поэтому, на мой взгляд, применимость reduce() в значительной степени ограничена ассоциативными операторами, и во всех остальных случаях лучше написать цикл накопления явно.
Не могли бы вы объяснить или указать мне соответствующую документацию, что означает '* setlist'? (В частности, что делает звездочка?) Спасибо! – PurpleVermont
Для всех, у кого может быть такой же вопрос, как я, я нашел ответ здесь: http://stackoverflow.com/questions/400739/what-does-asterisk-mean-in-python – PurpleVermont