Проверка, находится ли переменная цикла for в двух индексах списка - PullRequest
1 голос
/ 09 марта 2011

Это может быть сложно объяснить. Я хочу указать два индекса, а затем запустить цикл for. Если текущий x, проверяемый в цикле, является точно таким же элементом , указанным в месте расположения двух индексов, то он должен вернуть сообщение.

array = [ [1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4] ]

Опять же, вот мой массив. Я хочу, чтобы он прошел через цикл for и напечатал сообщение, когда x - это 1 в памяти array[0][0], то есть тот же кусок памяти.

for x in array:
    if x == array[0][0]:
        print "%s is the object you're looking for." % x

Теперь, почему я нуждаюсь в этом, чтобы удостовериться, что это точно такой же объект в памяти, потому что, это будет циклически повторять следующие три 1 в первом списке, и тоже будет возвращать сообщение, так как они имеют одинаковый значение как первое 1. Мне это не нужно . Мне нужно только сопоставить фактические точки в памяти, а не значения.

Ответы [ 4 ]

1 голос
/ 09 марта 2011

Я думаю, что вы спрашиваете, как проверить объект идентичность , а не объект равенство .

В Python вы можете сделать это с помощью оператора is , т.е.

if x is y:

Вместо:

if x == y:

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

>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a),id(b)
(13561552, 13561552)

Я думаю, что короткие строки автоматически «интернируются» таким образом, и вы можете заставить более длинные строки использовать функцию intern() :

>>> c = 'Long string'
>>> d = 'Long string'
>>> c is d
False
>>> c = intern(c)
>>> d = intern(d)
>>> c is d
True

Однако, похоже, тип long не интернирован, поэтому вы используете это:

>>> a = 1L
>>> b = 1L
>>> a is b
False

Однако идентификация объекта для встроенных типов зависит от реализации Python, а не от языка, и на это не следует полагаться в любом случае. Я думаю, что вам было бы лучше создать свой собственный класс объектов и написать соответствующий метод __eq__ для них, то есть написать свой код, который работает на основе равенства объектов, а не идентичности.

0 голосов
/ 09 марта 2011

а) это списки, а не кортежи и не массивы

b) for x in array:

проходит по списку «массив», например, х равен [1,1,1,1], затем [2,2,2,2], ... и то, что их нет в массиве позиций [контейнер] [индекс], не так ли?(чтобы быть придирчивым, они могли бы быть там, потому что список может содержать сам себя, но я не думаю, что это то, что вы хотите).

Что вы хотите точно сделать?

0 голосов
/ 09 марта 2011

Я не понимаю, что вы пытаетесь сделать:

for x in array: означает, что x сначала будет [1,1,1,1], затем [2,2,2,2] и так далее.С другой стороны, array[container][index] может быть только 1 ... как они могут быть равны?

В любом случае, использование is с числами не имеет смысла для начала.Может быть, вы должны спросить о реальной проблеме ...?

0 голосов
/ 09 марта 2011

На самом деле x это не элемент внутреннего кортежа, а целый внутренний кортеж.

Если я вас правильно понял, вы хотите напечатать весь кортеж, где элемент index такой же, как array[container][index], например:

for subtuple in array:
    if subtuple[index] is array[container][index]:
        print "%s is the object you're looking for." % subtuple

В результате [1, 1, 1, 1] is the object you're looking for.

...