Почтовые списки в 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 аргумента