#python #python-3.x #set
Вопрос:
Фон:
Я занимался рефакторингом кода из личного проекта и хочу знать, какой из двух средних фрагментов кода в примерах лучше всего использовать при создании набора из другого набора в сценарии данного типа. Конкретные условия и вставленные элементы не имеют значения.
Основной Пример
import itertools
# Example set
mySet={(6,6), (6,7), (6,8), (7,6), (7,7), (7,8)}
# First implementation
symmetric=set()
for x in mySet:
# Compare all for every element
if (x[1],x[0]) not in mySet:
# Append some reversed
symmetric.add(x[::-1])
hold=symmetric
# Second implementation
symmetric=set()
for x in mySet:
# Append all reversed
symmetric.add(x[::-1])
# Compare all via the implied algorithm
symmetric-=mySet
# Illustrate that the sets are identical
print('The sets are identical.') if (hold==symmetric) else print('The sets are not identical.')
Более Сложный Пример
import itertools
# Example set
mySet={(6,6), (6,7), (6,8), (7,6), (7,7), (7,8)}
# First implementation
someSet=set()
# Demonstrates use of itertools in for loop
for (a,b) in itertools.combinations(mySet, 2):
# Demonstrates initialization and/or assignment
pair=(a[0],b[1])
# Demonstrates possibility of multiple conditions
if a[0]==b[0] and pair not in mySet:
someSet.add(pair)
hold=someSet
# Second implementation
someSet=set()
for (a,b) in itertools.combinations(mySet, 2):
pair=(a[0],b[1])
if a[0]==b[0]:
someSet.add(pair)
someSet-=mySet
# Illustrate that the sets are identical
print('The sets are identical.') if (hold==someSet) else print('The sets are not identical.')
Вопросы:
- Чем именно отличаются реализации в этом контексте?
- Что следует использовать для этого сценария, когда в наборе(наборах) много и/или больших количеств?
Например:
# First implementation
newSet=set()
for x in mySet:
if pair not in setA and pair not in setB: # Given some setA and setB
newSet.add(x[::-1])
hold=newSet
# Second implementation
newSet=set()
for x in mySet:
newSet.add(x[::-1])
newSet=newSet-setA-setB # s1.difference(s2, s3)
Комментарии:
1. Чего именно вы хотите достичь с помощью своего кода? Можете ли вы описать это в одном или двух предложениях? Т. Е. Каковы входные данные и каковы выходные данные?
2. @a_guest mySet-это вход, а удержание/симметрия-идентичные выходы. mySet-это вход, а hold/someSet-идентичные выходы для второго примера. Меня интересует только то, какой раздел кода предпочтительнее для любого примера.
3. Глядя на ваш код, я не понимаю, что он должен делать, поэтому трудно судить, какой подход был бы лучшим. Поэтому я спросил, не могли бы вы объяснить назначение кода в нескольких предложениях. Это очень помогло бы понять, что происходит.
4. Кстати, в первом блоке кода в конце вашего вопроса, я полагаю, вы хотите использовать
and
вместоor
, потому что в противном случае это не то же самое, что второй блок кода. И почему вы используете списки для построения своих наборов? Почему бы не использоватьnewSet = set()
и тогдаnewSet.add(...)
? Если вы можете избавить себя от лишних операций, таких как добавление элемента и последующее удаление, это определенно хорошая идея, поэтому первый блок должен быть более эффективным.5. Если оба кода работают, используйте модуль timeit и найдите наиболее эффективный самостоятельно.