Словарь из текстового файла - PullRequest
1 голос
/ 01 мая 2019

У меня есть этот текстовый файл:

English 
hello bye 
italian 
ciao hola
spanish
hola chao

Я хочу создать словарь из каждых 2 последовательных строк:

{
    'English': 'hello bye',
    'italian': 'ciao hola',
    'spanish': 'hola chao',
}

Вот мой код:

d= {}
with open("test.txt", 'r') as f:
    l = f.readlines()
    for line in l:
        (key,val) = line.split()
        d[key]=val

Я получаю ошибку:

слишком много значений, чтобы распаковать ошибку

Ответы [ 5 ]

1 голос
/ 01 мая 2019

В исходном коде вы читаете все строки в файле за один раз, используя f.readlines(), а затем разбиваете каждую строку.Проблема в том, что не каждая строка дает вам список с двумя элементами, поэтому key, val = line.split() дает вам values to unpack, поскольку вы пытаетесь назначить один список элементов двум элементам.например, a,b = [2], что приведет к этой ошибке следующим образом.

In [66]: a,b = [2]                                                                                                                                            
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-f9f79b7d1d3c> in <module>
----> 1 a,b = [2]

ValueError: not enough values to unpack (expected 2, got 1)

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

dct = {}
with open("file.txt", 'r') as f:
    l = f.readlines()
    idx = 0
    while idx < len(l):
        #Even element is key, Odd element is value
        key = l[idx].strip()
        value = l[idx+1].strip()
        dct[key] = value
        idx+=2
#{'English': 'hello bye', 'italian': 'ciao hola', 'spanish': 'hola chao'}

Или более кратким решением с использованием dict-понимания является

l = []
with open("file.txt", 'r') as f:
    l = f.readlines()

#This will be a list of tuples, with the first element of tuple being the key #and second value being the value
#Keys are obtained by slicing all even indexes, and values by slicing all odd indexes
key_value_tups = zip(l[::2], l[1::2])
#[('English \n', 'hello bye \n'), ('italian \n', 'ciao hola\n'), ('spanish\n', 'hola chao\n')]

#Iterate through the tuples and create the dict via dict-comprehension
dct = {key.strip() : value.strip() for key, value in key_value_tups}

print(dct)
#{'English': 'hello bye', 'italian': 'ciao hola', 'spanish': 'hola chao'}
1 голос
/ 01 мая 2019

Вы также можете использовать этот подход:

d = {}
with open("test.txt", 'r') as f:
    l = f.readlines()
    i = 0
    while i < len(l):
        d[l[i].replace("\n","")] = l[i+1].replace("\n","")
        i += 2
1 голос
/ 01 мая 2019
i = 0
d = {}
prev_key = None
for line in l:
    if i % 2 == 0:
        prev_key = line
    else:
        d[prev_key] = line
    i += 1
0 голосов
/ 01 мая 2019

Вы можете сделать это в одной строке:

with open("test.txt", 'r') as f:
    lines = f.readlines()

dict( zip( lines[::2], lines[1::2] ) )
  • lines[::2] даст вам все элементы lines, имеющие четный индекс
  • lines[1::2] даст вам все элементы lines, которые имеют нечетный индекс zip создаст итератор (list1 elem, list2 elem) из двух списков

  • dict будет принимать каждый кортеж (key, value) из итератора в качестве элемента словаря и создавать словарь

Эта строка эквивалентна:

keys = []
values = []
for index, elem in enumerate(lines):
    if index % 2 == 0:
        keys += [elem]
    else:
        values += [elem]

d = {}
for key, val in zip(keys, values):
    d[key] = val
0 голосов
/ 01 мая 2019

Используйте словарь-понимание, используя zip():

with open("test.txt", 'r') as f:
    l = f.readlines()
    d = {x: y for x, y in zip(l[::2], l[1::2])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...