来自csv数据的Python字典,其键值是字典

时间:2014-04-13 05:07:15

标签: python csv dictionary zip tuples

我有一个包含以下数据的文件:

even;0;even;1;odd
odd;0;odd;1;even

我想创建一个字典,其中键是每行的第一个值,偶数和奇数,值是字典,键值为整数,值为偶数或奇数。因此,如果我使用这些数据创建一个字典,它应该像这样打印:

{'even': {'0': 'even', '1': 'odd'}, 'odd': {'0': 'odd', '1': 'even'}}

这是我的代码:

def read_fa(file) -> dict:
d = {}
data = read_file_values(file)
for line in data:
    values = line.split(';')
    inner_values = values[1:]
    inner_value_inputs = []
    inner_value_states = []
    for iv in inner_values:
        try:
            type(eval(iv)) is int
            inner_value_inputs.append(iv)
        except:
            inner_value_states.append(iv)
    inner_value_tuples = list(zip(inner_value_inputs, inner_value_states))    
    d[values[0]] = ({t[0]: t[1]} for t in inner_value_tuples)
print(d)

“read_file_lines()”函数我基本上读取了文件,如果我将内容放在列表中则打印出来:

['even;0;even;1;odd', 'odd;0;odd;1;even']

我的代码得到的输出是:

{'even': <generator object <genexpr> at 0x02927A30>, 'odd': <generator object <genexpr> at 0x02927AA8>}

而不是将第二个dict作为键,我得到了这个发生器。任何有关如何解决此问题的帮助,以及有关压缩代码以使其更紧凑的任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:0)

d[values[0]] = dict((t[0], t[1]) for t in inner_value_tuples)

OR

d[values[0]] = {t[0]: t[1] for t in inner_value_tuples}

答案 1 :(得分:0)

您也可以使用itertools为您剪切输入。

import itertools as it

data = ['even;0;even;1;odd', 'odd;0;odd;1;even']

out = {}
for d in data:
    elems = d.split(';')
    key = elems[0]
    evens = it.islice(elems, 1, None, 2)
    odds = it.islice(elems, 2, None, 2)
    out[key] = {x: y for x, y in zip(evens, odds)}

print out

>>> {'even': {'1': 'odd', '0': 'even'}, 'odd': {'1': 'even', '0': 'odd'}}