2017-01-10 3 views
2

Скажем, у меня есть список кортежей в Python, например, так (с использованием трех-кортежей в примере, но хотелось бы, чтобы это работало для любого размера кортежа):Как удалить n-кортежи из списка, где каждый элемент в n-кортежах идентичен?

myList = [('a','b','c'), 
      ('a','a','a'), 
      ('b','b','b'), 
      ('d','e','f') 
    ] 

Я хочу, чтобы удалить какой-либо n-кортеж, где каждый элемент n-кортежа один и тот же. В приведенном выше примере я хотел бы удалить кортежи ('a','a','a') и ('b','b','b'), потому что каждый из элементов в этих кортежах одинаковый.

Я написал цикл вложенных циклов, который делает это, но это кажется действительно неэффективным/не очень Pythonic, чтобы сделать это таким образом. Любые идеи о том, как сделать это проще и эффективнее?

def tuple_removal(aList): 
    elements = len(aList) # number of elements in the list 
    tuple_size = len(aList[0]) # size of the tuple 
    for i in reversed(range(elements)): 
     same_element_count = 1 # initialize counter to 1 
     for j in range(tuple_size-1): 
      # add one to counter if the jth element is equal to the j+1 element 
      same_element_count += aList[i][j] == aList[i][j+1] 
     if same_element_count == tuple_size: 
      # remove the tuple at the ith index if the count of elements that are the same 
      # is equal to the size of the tuple 
      del aList[i] 
    return(aList) 

myNewList = tuple_removal(myList) 
myNewList 

# Output 
myNewList = [('a','b','c'), 
      ('d','e','f') 
    ] 

ответ

3

Вы можете просто использовать список понимание и проверить, что Количество первого элемента в каждом согласующем кортеже не то же самое, как длина кортежа:

>>> r = [i for i in myList if i.count(i[0]) != len(i)] 
>>> r 
[('a', 'b', 'c'), ('d', 'e', 'f')] 
+1

Я протестировал все ответы здесь, и я считаю, что ваш самый быстрый ;-) +1 –

+0

Спасибо! Я возьму слово @leaf за это на скорости. 13 строк кода сокращены до 1. Это здорово. (И спасибо за все остальные ответы тоже). – user1895076

1

Преобразование каждого кортежа в набор; если результат имеет длину 1, все элементы были одинаковыми. Используйте это в списке понимание как фильтр, сохраняя все кортежи, которые имеют более чем один уникальный элемент:

def tuple_removal(lst): 
    return [t for t in lst if len(set(t)) > 1] 

Демо:

>>> myList = [('a','b','c'), 
...   ('a','a','a'), 
...   ('b','b','b'), 
...   ('d','e','f') 
...  ] 
>>> tuple_removal(myList) 
[('a', 'b', 'c'), ('d', 'e', 'f')] 
2

Вы можете использовать list comprehension и Тот st, чтобы увидеть, равны ли все элементы в данном кортеже с помощью встроенной функции all().

>>> myList = [('a','b','c'), 
      ('a','a','a'), 
      ('b','b','b'), 
      ('d','e','f') 
    ] 
>>> 
>>> [el for el in myList if not all(x == el[0] for x in el)] 
[('a', 'b', 'c'), ('d', 'e', 'f')] 
>>> 
Смежные вопросы