2011-03-15 1 views
0

Я понимаю zip() функции используются для построения списка кортежей, как это:Returing списков ключей кортежа и значение

x = ['a', 'b', 'c'] 
y = ['x', 'y', 'z', 'l'] 
lstTupA = zip(x,y) 

lstTupA будет [('a', 'x'), ('b', 'y'), ('c', 'z')].

lstA, lstB = zip(*lstTupA) 

Вышеописанная операция извлекает keys в списке кортежей к lstA и values в списке кортежей к lstB.

lstA был ('a', 'b', 'c') и lstB был ('x', 'y', 'z').

Мой запрос: Почему lstA и lstB кортежи вместо списков? a, b и c являются однородными, и поэтому x, y и z. Не логично группировать их как кортежи, не так ли?

В идеале lstA, lstB = zip(*lstTupA) должны были назначены ['a', 'b', 'c'] к lstA и ['x', 'y', 'z'] в lstB (списки) правильно?

Кто-то, пожалуйста, уточните!

Спасибо.

+2

«Почему кортежи возвращаются в кортеж?» - Немного странный вопрос. Я думаю, что вы, возможно, тот, кто нуждается в разъяснении. – MattH

+1

'zip' всегда возвращает список кортежей, в этом нет ничего неожиданного. Выполнение 'lstA, lstB = zip (..)' просто ест этот внешний список, это называется распаковкой последовательности. –

+0

@MattH - Да, это вопрос, на который нужно ответить в конечном счете !! – bdhar

ответ

5

Да. Логично.

Существует два типа встроенных последовательностей. Списки и кортежи.

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

Список будет иметь значение только в том случае, если другие аргументы были каким-то образом, магически, добавлены или не добавлены к полученной последовательности. Это означало бы последовательности переменной длины, не определяемые числом аргументов до zip(). Это будет довольно сложная структура для построения с помощью одного вызова функции.

+0

Не являются ли наборы и строки также встроенными последовательностями? –

+1

@ Space_C0wb0y: наборы имеют интерфейс итератора, но не являются последовательностями. Они не индексируются по позициям. Строки, в то время как последовательности, кажутся настолько неуместными, что не стоит упоминать их. –

2

zip просто определяется вести себя таким образом: «? Это не логично, чтобы сгруппировать их в виде кортежа, является его»

In [2]: help(zip) 
Help on built-in function zip in module __builtin__: 

zip(...) 
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)] 

    --> Return a list of tuples <--, where each tuple contains the i-th element 
    from each of the argument sequences. The returned list is truncated 
    in length to the length of the shortest argument sequence. 
2

Что *lstTupA делает в lstA, lstB = zip(*lstTupA) (или вообще оператор *) i для выравнивания итерации. Таким образом, zip(*lstTupA) равно zip(lstTupA[0], lstTupA[1], ...), и эти элементы являются кортежами, переданными в zip, и именно по этой причине lstA и lstB являются кортежами.

1

zip не знает, что находится на левой стороне знака равенства. Насколько известно, lstTupA = zip(x,y) и lstA, lstB = zip(*lstTupA) - это то же самое. zip определяется как одна вещь, и она постоянно делает это.Вы решили разбить список кортежей во втором выражении, так что вы тем самым добавляете дополнительный контекст во второй оператор.

1

В идеале lstA, lstB = застежка-молния (* lstTupA) должны были присвоены [ 'A', 'B', 'C'], чтобы lstA и [ 'х', 'у', 'г'], чтобы lstB (списки)?

Нет, это не так. Помните, что почтовый возвращает список кортежей, что это именно так, как вы ожидаете, что вести себя, когда вы говорите

lstTupA бы быть [(«а», «х»), («б», «у»), ('c', 'z')].

Итак, зачем ему возвращать что-то другое в случае zip(*lstTupA)? Он все равно вернет список кортежей, в данном случае [('a', 'b', 'c'), ('x', 'y', 'z')]. Выполняя присвоение lstA и lstB, вы просто извлекаете кортежи из списка.

0

Да, вы должны сделать что-то глупое, как

[list(t) for t in zip(*lst)] 

Просто чтобы получить списки.

То, что «питонисты», стремящиеся защитить выбор Braindead, не помнят, что кортежи не могут быть назначены. Что делает zip(*m)бесполезным для матриц или чего-нибудь еще, где вы хотите изменить элементы позже.

Смежные вопросы