Почтовые списки в Python

Я пытаюсь узнать, как "застегивать" списки. С этой целью у меня есть программа, в которой в какой-то момент я делаю следующее:

x1, x2, x3 = stuff.calculations(withdataa)

Это дает мне три списка: x1, x2 и x3, каждый из которых, скажем, размер 20.

Теперь я:

zipall = zip(x1, x2, x3)

Однако, когда я это делаю:

print "len of zipall %s" % len(zipall)

Я получаю 20, чего я не ожидал. Я ожидал три. Я думаю, что я делаю что-то принципиально неправильное.

Ответ 1

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

Смотрите сами:

In [1]: a = b = c = range(20)

In [2]: zip(a, b, c)
Out[2]: 
[(0, 0, 0),
 (1, 1, 1),
 ...
 (17, 17, 17),
 (18, 18, 18),
 (19, 19, 19)]

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

In [3]: result = zip(a, b, c)

In [4]: len(result[0])
Out[4]: 3

Конечно, это не сработает, если списки пустые для начала.

Ответ 2

zip берет кучу списков.

a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...

и "застегивает" их в один список, чьи записи представляют собой 3-х кортежей (ai, bi, ci). Представьте, что вы рисуете молнию горизонтально слева направо.

Ответ 3

zip создает новый список, заполненный кортежами, содержащими элементы из итерируемых аргументов:

>>> zip ([1,2],[3,4])
[(1,3), (2,4)]

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

Ответ 4

В python 2.7 это могло бы работать нормально.

>>> a=b=c=range(20)
>>> zip(a,b,c)

Но в python 3.4

>>> a=b=c=range(20)
>>> list(zip(a,b,c))

Ответ 5

В основном функция zip работает с списками, кортежами и диктатором в python. если вы используете ipython, тогда просто введите zip? и проверьте, что такое zip(). если вы не используете ipython, тогда просто установите его "pip install ipython"

для списков

a=['a','b','c']
b=['p','q','r']
zip(a,b)

вывод [('a', 'p'), ('b', 'q'), ('c', 'r')

для словаря

c={'gaurav':'waghs','nilesh':'kashid','ramesh':'sawant','anu':'raje'}
d={'amit':'wagh','swapnil':'dalavi','anish':'mane','raghu':'rokda'}
zip(c,d)

вывод

[('gaurav', 'amit'),
 ('nilesh', 'swapnil'),
 ('ramesh', 'anish'),
 ('anu', 'raghu')]

Ответ 6

За полноту.

Если размер прописных букв не равен. Длина списка результатов станет самой короткой без ошибок.

>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]

Ответ 7

Источник: Моя запись в блоге (лучшее форматирование)

Пример

numbers = [1,2,3]
letters = 'abcd'

zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]

Ввод

Ноль или несколько итераций [1] (например, список, строка, кортеж, словарь)

Вывод (список)

1st tuple = (element_1 чисел, element_1 букв)

2-й кортеж = (числа e_2, e_2 буквы)

...

n-th tuple = (числа e_n, буквы e_n)

  • Список n кортежей: n - длина кратчайшего аргумента (ввод)
    • len (numbers) == 3 < len (буквы) == 4 → short = 3 → вернуть 3 кортежа
  • Длина каждого кортежа = # аргументов (кортеж берет элемент из каждого аргумента)
    • args = (числа, буквы); len (args) == 2 → кортеж с 2 элементами
  • i th tuple = (element_i arg1, element_i arg2..., element_i arg n)

Пограничные случаи

1) Пустая строка: len (str) = 0 = нет кортежей

2) Single String: len (str) == 2 кортежа с len (args) == 1 элемент (ы)

zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]

Почтовый индекс в действии!

1. Создайте словарь [2] из двух списков

keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]

my_favorite = dict( zip(keys, values) )

my_favorite["drink"]
# 'La Croix'

my_faves = dict()
for i in range(len(keys)):
    my_faves[keys[i]] = values[i]
  • zip - это элегантное, четкое и сжатое решение.

2. Печать столбцов в таблице

"*" [3] называется "распаковкой": f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)

student_grades = [
[   'Morty'  ,  1   ,  "B"  ],
[   'Rick'   ,  4   ,  "A"  ],
[   'Jerry'  ,  3   ,  "M"  ],
[  'Kramer'  ,  0   ,  "F"  ],
]

row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']

columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')

Дополнительный кредит: Распаковка

zip(*args) называется "распаковкой", потому что он имеет обратный эффект zip

numbers = (1,2,3)
letters = ('a','b','c')

zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]

unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
  • unzipped: tuple_1 = e1 каждого заархивированного кортежа. tuple_2 = e2 каждого zipped

Сноски

  • Объект, способный возвращать свои члены по одному (например, список [1,2,3], строка "Мне нравится codin", кортеж (1,2,3), словарь {'a': 1, 'B': 2})
  • {key1: value1, key2: value2...}
  • "Распаковка" (*)

* Код:

# foo - function, returns sum of two arguments
def foo(x,y):
    return x + y
print foo(3,4)
# 7

numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)

print foo(*numbers)
# 3

* взял numbers (1 arg) и "распаковал" его 2 элемента в 2 аргумента