我有一本字典如下: -
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 :(得分: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 :(得分:6)
显而易见的解决方案是使用iterkeys
和itervalues
代替iteritems
:
key_string = ','.join(d.iterkeys())
val_string = ','.join(d.itervalues())
如果您担心不同顺序中显示的键和值,而Python允许dicts以他们想要的任何顺序进行迭代,那么它会记录here,如果您反复迭代它们在你之间做任何其他事情都会得到相同的订单:
如果
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
。< / p>
最后,如果您想使用iteritems
(请假设您使用的是每次随机化迭代顺序的破解的不完全兼容的Python解释器),您可以使用zip
:
keys, values = zip(*d.iteritems())
将一对序列转换为一对序列。
答案 2 :(得分:1)
你可以这样做:
key_string = ','.join(dict.keys())
val_string = ','.join(dict.values())
答案 3 :(得分:0)
使用相同的功能str.join(iterable)
,如果字典值不是全部字符串,则使用list-comprehension shorthand:
d = {'a': '1', 'b': 2, 'c': {'d': 3}, 'e': [4,5,6]}
print(",".join(d.keys()))
print(",".join([str(e) for e in d.values()]))
输出:
a,b,c,e
1,2,{'d': 3},[4, 5, 6]
如果要自定义格式,则可以使用优雅的抽象。将str(e)
替换为您的自定义格式化程序myFormatter(e)
。