我有一个问题。我试图将其他问题的信息汇总起来但没有成功。 假设我有以下格式的数据:
file_list = ["f1", "f2", "f3"]
inner_dict = {1: "one", 2: "two", 3: "three"}
outer_dict = {}
for f in file_list:
outer_dict[f] = inner_dict
我的目标是以下列方式打印(保存到文件中):
f1, 1, one
f1, 2, two
f1, 3, three
f2, 1, one
f2, 2, two
f2, 3, three
f3, 1, one
f3, 2, two
f3, 3, three
为此目的,我开始关注outer_dict
的项目,我设法单独打印它们,但我不确定如何进一步加入(更重要的是,如果这是最直接的方式去)。
for key, value in outer_dict.items():
inn_keys = value.keys()
inn_values = value.values()
b1 = "\n".join([str(x) for x in inn_keys] )
b2 = "\n".join([str(x) for x in inn_values] )
感谢您的任何建议。
答案 0 :(得分:2)
你可以这样做:
string_list = []
for el1 in file_list:
for el2 in inner_dict.items():
string_list.append(", ".join([el1, str(el2[0]), el2[1]]))
print(string_list)
<强>输出:强>
['f1, 1, one',
'f1, 2, two',
'f1, 3, three',
'f2, 1, one',
'f2, 2, two',
'f2, 3, three',
'f3, 1, one',
'f3, 2, two',
'f3, 3, three']
答案 1 :(得分:2)
将代码修改为工作将如下所示:
b1 = ""
for key, value in outer_dict.items():
b1 += "\n".join([','.join([key,str(k),v]) for k, v in value.items()]) + '\n'
但是,我认为你做的比它在python中应该更复杂,一个更简单的解决方案是使用嵌套循环:
s = ""
for f in file_list:
for k,v in inner_dict.items():
s+= ','.join([f,str(k),v]) + "\n"
我确定你可以找到一个能为你做这件事的单线。
答案 2 :(得分:1)
可以在您的情况下使用双join
,请务必将 ints
转换为 str
:
print '\n'.join([', '.join([e1] + [str(e) for e in e2]) for e1, e2 in zip(file_list, inner_dict.items())])
f1, 1, one
f2, 2, two
f3, 3, three
答案 3 :(得分:0)
这个oneliner怎么样 - 只是连接元组(即[(i,)+j for j in inner_dict.items() for i in file_list]
)并将元组列表展平成一个简单的列表。
[item for sublist in [(i,)+j for j in inner_dict.items() for i in file_list] for item in sublist]
输出 -
['f1', 1, 'one', 'f2', 1, 'one', 'f3', 1, 'one', 'f1', 2, 'two', 'f2', 2, 'two', 'f3', 2, 'two', 'f1', 3, 'three', 'f2', 3, 'three', 'f3', 3, 'three']
N.B。如果使用字典维护订单,最好使用OrderedDict。
答案 4 :(得分:0)
似乎其他答案假定字典中的确定性顺序。但字典do not have a deterministic order。实际上,您可以在Python 2中设置hash_randomization
。只需从命令行选项-R
开始:
python -R
因此,为了使这项工作更可靠,并且使用Python 3,还要对内部字典的键进行排序。由于它被多次使用,因此只对它进行一次排序,并在文件列表的所有迭代中重复使用它:
from __future__ import print_function
file_list = ["f1", "f2", "f3"]
inner_dict = {1: "one", 2: "two", 3: "three"}
inner_list = [', '.join([str(key), inner_dict[key]]) for key in sorted(inner_dict)]
for fname in file_list:
for inner in inner_list:
print('{}, {}'.format(fname, inner))
输出:
f1, 1, one
f1, 2, two
f1, 3, three
f2, 1, one
f2, 2, two
f2, 3, three
f3, 1, one
f3, 2, two
f3, 3, three
答案 5 :(得分:0)
由于您想将其保存到csv文件,请查看是否有帮助。如果订单很重要,您可以使用OrderedDict
。
from collections import OrderedDict
import csv
file_list = ["f1", "f2", "f3"]
inner_dict = {1: "one", 2: "two", 3: "three"}
outer_dict = OrderedDict()
for f in file_list:
outer_dict[f] = inner_dict
rows = []
for i,k in outer_dict.items():
for m,n in k.items():
rows += [[str(x) for x in [i, m, n]]]
with open('test.csv', 'w') as f:
_csv = csv.writer(f, escapechar=' ', quoting=csv.QUOTE_NONE)
[_csv.writerow(row) for row in rows]
test.csv文件看起来如此:
f1,1,one
f1,2,two
f1,3,three
f2,1,one
f2,2,two
f2,3,three
f3,1,one
f3,2,two
f3,3,three