使用.join()来操作嵌套字典的内部字典元素

时间:2016-02-07 08:41:16

标签: python python-2.7 dictionary join python-2.x

我有一个问题。我试图将其他问题的信息汇总起来但没有成功。 假设我有以下格式的数据:

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] )

感谢您的任何建议。

6 个答案:

答案 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

这是default in Python 3

因此,为了使这项工作更可靠,并且使用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