Реализация разницы наборов в Python

#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 и найдите наиболее эффективный самостоятельно.