2015-05-04 44 views
2

我有一本字典,如下所示: -什么是一个优雅的方式来将Python字典转换为逗号分隔的键字符串和逗号分隔值字符串?

dict={'a':'1','b':'2', 'c':'3'} 

要将其转化成一个逗号分隔的钥匙串key_string和逗号分隔值的字符串val_string我做到以下几点: -

key_list=[] 
val_list=[] 

for key,value in dict.iteritems(): 
    key_list.append(key) 
    val_list.append(value) 

key_string = ','.join(key_list) 
val_string = ','.join(val_list) 

结果是

key_string = "a,b,c" 
val_string = "1,2,3" 

有没有更高效/优雅的方式来做到这一点?

+0

你要“高效”或“优雅”?这两者往往是交叉的目的。你的意思是“有效”,如“最短时间”或“最短临时空间”或其他措施? – abarnert

+1

如果我告诉你'val_string =','。join(dict.values())',我相信你可以计算出另一个... – jonrsharpe

+0

这样的事情? ','。join(map(lambda x:str(x),[1,2])) –

回答

6

明显的解决方法就是使用iterkeysitervalues代替iteritems

key_string = ','.join(d.iterkeys()) 
val_string = ','.join(d.itervalues()) 

如果你担心的键和值显示在不同的顺序了,而Python允许类型的字典以任何顺序迭代他们想要的,它记录here,如果你一遍又一遍地重复他们没有做其他任何事情之间,你会得到相同的顺序:

如果items()keys(),values(),iteritems(),iterkeys()itervalues()被调用时没有对字典进行中间修改,这些列表将直接对应。

(2.7文档一直没有更新,这么说,但它也确实为viewitemsviewkeysviewvalues


至少在CPython的,它可能会稍微更有效使用keysvalues而不是iterkeysitervalues(因为当给定迭代器时,str.join的CPython实现只是列表中的一个列表),但我怀疑这一点。正如Padraic Cunningham在评论中指出的那样,对于密钥(但不是数值),只需要list(d)而不是d.keys()(即使没有,它可以避免LOAD_ATTR呼叫,但在成本为LOAD_NAME,除非您首先将list复制到本地,因此它可以是LOAD_FAST ed)。


最后,如果你想与iteritems做到这一点(假设你正在使用,每次会随机迭代顺序破兼容不-相当的Python解释器),你可以使用zip为:

keys, values = zip(*d.iteritems()) 

将一对序列变成一对序列。

+0

您可以在不调用.iterkeys的情况下在d上调用“”.join(),虽然您已经说过像'list(d)会更有效率,也是在python 3脚本的不同运行可以改变键和值的顺序,这是不同的行为python 2. –

+0

@PadraicCunningham:是的,我想'','。join(list(d) )'可能是CPython 2.7中最高效的。如果任何人真的关心,我会测试所有的可能性,但我怀疑任何人的。无论如何,为了与'itervalues()'并行,我认为'iterkeys()'在这里更具可读性。 – abarnert

+0

@PadraicCunningham:对于运行之间的顺序,实际上,Python绝对不会保证每次运行都会得到相同的顺序。 2.7和3.4的命令几乎完全相同。确实,CPython 3.4默认使用字符串散列随机化,而2.7(和3.3)则不使用,但是然后Jython 2.5在每次运行中都会给你一个不同的顺序,同时,有人说'dict'保持插入默认情况下,在CPython 3.5中(也许甚至需要它用于其他实现),所以这不是真正的Python 2与Python 3的东西。 – abarnert

8

使用str.join(iterable)(提示:不要命名您的字典dict):

d = {'a':'1', 'b':'2', 'c':'3'} 
print(",".join(d.keys())) 
print(",".join(d.values())) 

输出:

c,a,b 
3,1,2 

需要注意的是一个字典里没有秩序。所以输出也没有任何可以依赖的顺序。

1

你可以做这样的:

key_string = ','.join(dict.keys()) 
val_string = ','.join(dict.values())