Как выполнять итерацию до тех пор, пока не будет исчерпан самый длинный итератив.Использование zip_longest для итерации - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь использовать itertools.zip_longest для продолжения итерации, пока не будет исчерпан самый длинный итератив (вместо самого короткого, как это делает обычный zip).Мне также нужно передать это в словарь.Тем не менее, я все еще пропускаю значения.У меня должно быть около 1300 значений, но только около 560. Что я пропускаю или делаю неправильно?

import csv
from itertools import zip_longest

my_csv = 'my_csv_file' + '.csv'

some_list = []
another_list = []
my_dictionary = {}

with open(my_csv, newline='') as f:
    reader = csv.reader(f)
    next(reader, None)
    for row in reader:
        some_list.append(row[0])
        another_list.append(row[1:])

my_dictionary = dict(zip_longest(some_list, another_list, fillvalue=None))

for v in my_dictionary.keys():
    print(v)

count = len(my_dictionary.keys())
print(str(count) + " keys")

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Мне не совсем понятно, что вы пытаетесь вывести, но, возможно, один из этих примеров может помочь.

Учитывая это содержимое файла csv:

a,b,c
11,12,13
21,22,23


Первый вариант - поместить заголовки в список, а затем остальные данные, перенесенные в другой список.Затем вызовите dict() в сжатом списке, здесь не нужно zip_longest:
with open(my_csv, newline='') as f:
    reader = csv.reader(f)
    headers = next(reader, None) # place headers in a list
    rows = [row for row in zip(*reader)] # this transpose the data

print(rows) #=> [('11', '21'), ('12', '22'), ('13', '23')]

my_dictionary = dict(zip(headers, rows))
print(my_dictionary)
#=> {'a': ('11', '21'), 'b': ('12', '22'), 'c': ('13', '23')}


Второй вариант создает список словарей:
my_dictionaries = []
with open(my_csv, newline='') as f:
    reader = csv.reader(f)
    headers = next(reader, None) # place headers in a list
    for row in reader:
      my_dictionaries.append(dict(zip(headers, row)))

print(my_dictionaries)
#=> [{'a': '11', 'b': '12', 'c': '13'}, {'a': '21', 'b': '22', 'c': '23'}]
0 голосов
/ 16 февраля 2019

Звучит так, как будто есть ключи с дублирующимися значениями, которые свернутся до самого последнего значения (например: {1: 'a', 2: 'b', 1: 'c'} свернется до {1: 'c', 2: 'b'}).

Возможно, вы захотите использовать list какзначения вместо:

from collections import defaultdict

# Set-up...

my_dictionary = defaultdict(list)
for key, value in zip_longest(some_list, another_list, fillvalue=None)
    my_dictionary[key].append(value)

for v in my_dictionary.keys():
    print(v)

keys = len(my_dictionary)
values = sum(len(value) for value in my_dictionary.itervalues())
print(str(keys) + " keys, " + str(values) +  " values")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...