Для функций, которые принимают неопределенное количество аргументов в Python, как передать неопределенное количество аргументов - PullRequest
0 голосов
/ 23 февраля 2011

Например, скажем, у меня есть неопределенное количество наборов, которые я хочу объединить:

bigSet = bigSet.union(<listOfSets>)

Я мог бы просто сложить каждый набор, то есть:

bigSet = reduce(lambda x,y: x.union(y), listOfSets)

Другая альтернативаиспользовать функцию eval:

stringTuple = str(listOfSets)
stringTuple = stringTuple.strip("[")
stringTuple = stringTupl.strip("]")
bigSet = eval("bigSet.union(" + stringTuple + ")")

Причина, по которой я спрашиваю, заключается в том, что в python2.6 передача нескольких аргументов в объединение (а не сведение его через список объединений) оптимизирует объединение так, чтобысамые маленькие наборы сначала объединяются.Поскольку наборы в python часто являются лучшей структурой данных для очень больших наборов данных (особенно когда они должны быть объединены или пересечены), и кажется довольно распространенным, что у вас есть неопределенное количество наборов для передачи, поэтому следуетбыть более оптимальным способом сделать это.Если нет, то что быстрее: использовать eval или сворачивать по сетам?

Ответы [ 2 ]

5 голосов
/ 23 февраля 2011

union принимает произвольное количество наборов в качестве аргументов:

In [28]: x.union(set([1,2]),set([2,3]),set([3,4]))
Out[28]: set([1, 2, 3, 4])

Следовательно, вы можете объединить список наборов с помощью

bigSet = bigSet.union(*listOfSets)

Обратите внимание на звездочку .

0 голосов
/ 23 февраля 2011

Похоже, вы хотите расширить список наборов в список аргументов функции, например,

sets = [set([1,2,3]), set([3,4,5]), set([5,6,7])] 
union(*sets)
...