将python字典转换为逗号分隔的键字符串和逗号分隔值字符串的优雅方法是什么?

nim*_*rma 2 python string dictionary function

我有一本字典如下: -

dict={'a':'1','b':'2', 'c':'3'}
Run Code Online (Sandbox Code Playgroud)

要将其转换为逗号分隔的键字符串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)
Run Code Online (Sandbox Code Playgroud)

结果是

 key_string = "a,b,c"
 val_string = "1,2,3" 
Run Code Online (Sandbox Code Playgroud)

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

小智 9

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

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

输出:

c,a,b
3,1,2
Run Code Online (Sandbox Code Playgroud)

请注意,字典没有订单.所以输出也没有你可以依赖的任何顺序.


aba*_*ert 6

显而易见的解决方案是使用iterkeys而itervalues不是iteritems:

key_string = ','.join(d.iterkeys())
val_string = ','.join(d.itervalues())
Run Code Online (Sandbox Code Playgroud)

如果你担心键和值会出现在不同的顺序中,而Python允许dicts按照他们想要的任何顺序进行迭代,那么它确实记录了如果你反复迭代它们而不做其他任何事情你会得到相同的订购:

如果items(),keys(),values(),iteritems(),iterkeys(),和itervalues()被称为中间没有修改的字典,列表会直接对应.

(2.7的文档一直没有更新,这么说,但它也是如此viewitems,viewkeys和viewvalues).


至少在CPython中,它的使用效率可能略高一些keys,values而不是iterkeys和itervalues(因为,当给定一个迭代器时,CPython实现str.join只是从中创建一个列表),但我怀疑这很重要.正如Padraic Cunningham在评论中指出的那样,对于键(但不是值),您可以更快地获得相同的列表list(d)而不是d.keys()(尽管可能不是 - 它避免了LOAD_ATTR呼叫,但代价是LOAD_NAME,除非你第一次复制list到本地,所以它可以LOAD_FAST编辑).


最后,如果您想要这样做iteritems(假设您使用的是一个破碎的不完全兼容的Python解释器,每次都将迭代顺序随机化),您可以使用zip它:

keys, values = zip(*d.iteritems())
Run Code Online (Sandbox Code Playgroud)

这将一对序列转换为一对序列.