2013-01-23 2 views
1

У меня есть два списка:Функция Zip не возвращает ожидаемый результат в Python?

a = ['a', 'b', 'c'] 
b = [1] 

Я хочу, чтобы мой выход, как:

a, 1 
b, 1 
c, 1 

Пробовал делать это:

for i, j in zip(a, b): 
    print i, j 

я получаю только a, 1. Как я могу исправить это?

Это мой фактический сценарий:

if request.POST.get('share'): 
      choices = request.POST.getlist('choice') 
      person = request.POST.getlist('select') 
      person = ''.join(person) 
      person1 = User.objects.filter(username=person) 
      for i, j in izip_longest(choices, person1, fillvalue=person1[-1]): 
       start_date = datetime.datetime.utcnow().replace(tzinfo=utc) 
       a = Share(users_id=log_id, files_id=i, shared_user_id=j.id, shared_date=start_date) 
       a.save() 
      return HttpResponseRedirect('/uploaded_files/') 
+0

Я не уверен, какой тип объекта делает 'User.objects .filter (имя пользователя = человек) 'возвращает, может быть, он возвращает итератор? –

+0

Ничего! Замена на 0 решена проблема – user1881957

ответ

5

Вы должны, вероятно, использовать itertools.izip_longest() здесь:

In [155]: a = ['a', 'b', 'c'] 

In [156]: b = [1] 

In [158]: for x,y in izip_longest(a,b,fillvalue=b[-1]): 
    .....:  print x,y 
    .....:  
a 1 
b 1 
c 1 

В случае zip() как длина b только один, поэтому он собирается вернуться только один результат. т.е. его длина результата равен min(len(a),len(b))

Но в случае izip_longest длина результата max(len(a),len(b)), если fillvalue не предусмотрен, то она возвращает None.

+1

+1 На этот раз вы били * меня * на него ':)' – Volatility

+0

Точно! Приветствую человека! – user1881957

+0

Получение этой ошибки: отрицательная индексация не поддерживается. – user1881957

1

ОК, я опаздываю, по крайней мере, один час, но что об этой идее:

a = ['a', 'b', 'c'] 
b = [1] 

Поскольку Документы на почтовом состоянии

The returned list is truncated in length to the length of the shortest argument sequence.

, что о превращении списка к более короткому аргументу? А так как все короче цикл, который проходит навсегда, давайте попробуем

import itertools 

d = zip(a, itertools.cycle(b)) 

Благодаря Ашвини Чаудхари для приведения itertools в мое внимание;)

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