Команда Python работает, но почему? - PullRequest
1 голос
/ 16 марта 2012

У меня есть простой код, который выглядит следующим образом в Python:

a = [1,2,3]
b = [2,4,6]

def union(a,b):
    pos = 0
    while pos < len(b):
        n = b[pos]
        if n in a is not 'True':
            a = a
        else:
            a.append(n)
        pos = pos +1
    return a

print union(a,b)

Как видите, первое утверждение IF не имеет смысла. Однако, если я кодирую это так:

if n in a is 'True':
    a.append(n)

это не работает. Первый сегмент кода меняет a = [1,2,4,6] - добавляются только числа из списка «b», которых нет в списке «a». Если я изменю фрагмент кода «IF» на «is True», как предложено, он не будет работать.

Хотя эта функция и делает то, что я намеревался сделать, я чувствую, что она не чистая, и я понятия не имею, почему «если n в a равно« True »:» не будет вести себя равным части else «если n в не 'True': "функция.

Может кто-нибудь, пожалуйста, помогите мне понять это?

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

Это не очень питонический способ использовать логическую проверку, а затем сравнить ее со строкой, поэтому было бы лучше сделать это следующим образом:

a = [1,2,3]
b = [2,4,6]

def union(x,y):
    for v in y:
        if v not in x:
            x.append(v)
    return x

print union(a,b)

ИЛИ:

a.extend(set(b).difference(set(a)))
print a
>>> [1, 2, 3, 4, 6]

ИЛИ, если вас не волнует создание новых объектов, чем:

print list(set(a).union(b))
2 голосов
/ 16 марта 2012

in и is / is not оба являются реляционными операторами , а в Python реляционные операторы связаны между собой.Следовательно, n in a is not 'True' эквивалентно n in a and a is not 'True', а n in a is 'True' эквивалентно n in a and a is 'True'.Ясно, что это не отрицания друг друга, так как они оба имеют n in a.

Но не используйте is, если не уверены, что оно вам нужно, и никогда не сравнивайте его с логическим значением (кроме йадда йадда).

1 голос
/ 16 марта 2012

Вы должны просто использовать True, а не строку 'True'

или еще лучше, просто

if n not in a:
    a.append(n)

Если вы новичок, вы можете не понимать, что Python имеетвстроенный тип с именем set

set объекты уже имеют методы для пересечения / объединения и т. д.

0 голосов
/ 16 марта 2012

Вы можете использовать

if n in a 

или

if n not in a

вместо is 'True'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...