Лучший способ найти наличие массивов в списке массивов - PullRequest
0 голосов
/ 18 ноября 2011

Я новичок в Python и пробую разные способы оптимизации и упрощения моего кода.

У меня есть список массивов (обязательно в этом формате), изначально пустой, который мне нужно обновить массивами, чтобы убедиться, что дублирующиеся записи не добавляются.

Сейчас я делаю это следующим образом, и это единственное, что я попробовал, и это работает:

if len(where(((array(self.pop_next)-(self.pop[self.top_indv_indx[i]]))==0).sum(1)==len((self.pop[self.top_indv_indx[i]])))[0])<=0):
     self.pop_next.append(self.pop[self.top_indv_indx[i]])

, где self.pop_next - мой список массивов, а self.pop[self.top_indv_indx[i]] - добавляемый массив.

Я знаю этот непитоник и думаю, что есть гораздо лучшие простые способы сделать то же самое. Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Редактировать: Я вижу из вашего комментария, что вы используете numy массивы. Я никогда не использовал numpy, поэтому понятия не имею, как они работают с сетами.

Одним из вариантов будет использование set. Наборы похожи на списки , но они неупорядочены и позволяют добавлять каждый элемент только один раз:

>>> s = set()
>>> s.add(1)
>>> s.add(2)
>>> s.add(2)
>>> s.add(2)
>>> s
set([1, 2])

Однако у вас возникнут проблемы, если вы попытаетесь добавить list в набор:

>>> s.add(['my','list'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Элемент должен быть хэшируемым , чтобы добавить к set, а list не может быть хэшируемым, поскольку он не может иметь неизменного значения хеш-функции, поскольку его можно изменить в любое время с помощью добавление или удаление значений.

Если вам не нужны списки, которые вы проверяете на изменчивость, вы можете преобразовать их в кортежи, которые являются фиксированными и поэтому могут быть хэшируемыми и настолько удобными для установки:

>>> mylist = ['my','list']
>>> s = set()
>>> s.add(tuple(mylist))
>>> s.add(tuple(mylist))
>>> s
set([('my', 'list')])
0 голосов
/ 18 ноября 2011

Вы можете попробовать использовать numpy.all(array1 == array2) в качестве условия для сравнения отдельных массивов.

Расширение в редактировании:

Для циклического перемещения по списку вы можетеиспользуйте следующее:

if all((numpy.all(array_to_add != a) for a in array_list)):
    array_list.append(array_to_add)

Сравнивает array_to_add со всеми элементами array_list по значению.Обратите внимание, что all здесь __builtin__.all, в отличие от numpy.all.Если вы сделали from numpy import * раньше, это не будет работать.Вместо этого используйте import numpy и вызывайте функции по полному имени, как в примере выше.

Если можно сравнивать по объекту (т. Е. Два массива одинаковы, только если они точно совпадают с объектом в памяти),используйте следующий более простой вариант:

if array_to_add is not in array_list:
    array_list.append(array_to_add)
...