我有一个包含以下数据的文件:
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作为键,我得到了这个发生器。任何有关如何解决此问题的帮助,以及有关压缩代码以使其更紧凑的任何建议都表示赞赏。
答案 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'}}