我一直在解析一些JSON文件,并最终得到一个字典,字符串作为键,元组列表作为值。
dict
具有以下格式:
str1: [(int1, bool), (int2, bool), ... ],
str2: [(int1, bool), (int2, bool), (int3, bool), ... ],
...
strN ...
我想要实现的是一个看起来像这样的表:
int1 int2 int3
str1 bool bool
str2 bool bool bool
如果没有在嵌套的fors和ifs上编写一个很长的算法,有没有办法做到这一点?不要求为我写这个,而只是暗示正确的方向。
我只想知道如何将数据操作为类似的格式。如果它兼容将其写入CSV或理想情况下的Excel文件,那就太好了。
答案 0 :(得分:3)
如果您已将JSON解析为data
,看起来像
data = {
'str1': [('int1', 'bool'), ('int2', 'bool')],
'str2': [('int1', 'bool'), ('int2', 'bool'), ('int3', 'bool')] }
然后您可以使用
将其加载到Pandas DataFrame中import pandas as pd
df = pd.DataFrame({key:pd.Series(dict(seq)) for key, seq in data.items()}).T
这样
print(df)
产量
int1 int2 int3
str1 bool bool NaN
str2 bool bool bool
和
df.to_csv('/tmp/out.csv')
生成包含内容的CSV
,int1,int2,int3
str1,bool,bool,
str2,bool,bool,bool
答案 1 :(得分:0)
嗯,你正在解析行和行,如果你需要遍历它们 - 例如,为了检查或处理目的 - 任何算法都会在lines*rows
个项目中运行。
现在,如果你不是太担心性能而是担心可读性,你可以将解析分成一些具有明确名称的函数,这些函数可以完成一小部分操作。即使某些函数仅是提取的for循环,它也会提高可读性。
答案 2 :(得分:0)
看起来非常直接,所以;
然后,将JSON解析为数据结构(可能是map
或list
并带有array
),并通过解析该数据结构将其写入CSV。
如果数据结构不符合生成所需格式,请使用简单的for loop
来修改和转换数据结构。
解决效率问题;
答案 3 :(得分:0)
假设您所拥有的内容已经被解析为元组列表的元组,那么您要问的是如何将它们分组到表中。
存储具有稀疏轴的2D表的一种显而易见的方法是使用dict,键入int
和str
值。例如:
d = defaultdict(dict)
seen_ints = set()
for s, pairs in rows:
for i, b in pairs:
d[s][i] = b
seen_ints.add(i)
现在,要获取行,只需迭代d[s].items()
即可。或者,如果您希望它们按字符串的排序顺序,则迭代sorted(d[s].items())
。每一行都是一个词典;要按所需顺序获取列,只需访问row[key] for key in seen_ints
即可。 (如果您希望列也排序,只需在外循环之前执行seen_ints = sorted(seen_ints)
。)
或者,您可以使用csv.DictWriter
删除seen_ints
集,然后将每行dict
写为CSV行。