添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

将python字典转换为逗号分隔的key字符串和逗号分隔的value字符串的优雅方式是什么?

8 人关注

我有一本字典,内容如下:-

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)

The result is

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

是否有更有效/更优雅的方法来做这件事?

5 个评论
你想要 "高效 "还是 "优雅"?这两者往往是相互矛盾的。你的意思是 "高效 "是指 "最少的时间 "或 "最少的临时空间 "或其他一些措施?
如果我告诉你 val_string = ','.join(dict.values()) ,我相信你可以算出另一个。
像这样吗?','.join(map(lambda x:str(x), [1,2])
你是否期望键/值以任何特定顺序出现?
@AshishAcharya:这并没有做到将键和值分开。而 lambda x: str(x) 只是想写成 str ,速度较慢且不太优雅。而且,鉴于他所有的键和值都已经是字符串了,所以没有必要这样做。
python
string
function
dictionary
nimeshkiranverma
nimeshkiranverma
发布于 2015-05-04
4 个回答
user1907906
发布于 2019-06-10
已采纳
0 人赞同

Use str.join(iterable) (提示:不要给你的Dict起名字 dict ):

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

Output:

c,a,b
3,1,2

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

abarnert
abarnert
发布于 2019-06-10
0 人赞同

明显的解决办法是只用 iterkeys itervalues ,而不是 iteritems

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

如果你担心键和值会以不同的顺序出现,虽然Python允许dict以任何顺序迭代,但它确实记录了here如果你不做任何其他事情,反复迭代它们,你会得到相同的顺序。

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

(2.7版本的文档从未更新以说明这一点,但对于viewitemsviewkeysviewvalues也是如此。)

至少在CPython中,使用keysvalues而不是iterkeysitervalues可能会更有效率(因为。因为当给定一个迭代器时,CPython对str.join的实现只是将其做成一个列表),但我怀疑这是否重要。正如Padraic Cunningham在评论中指出的,对于键(但不是值),你可能会用list(d)而不是d.keys()更快地得到相同的列表(尽管可能不是--它避免了LOAD_ATTR的调用。但代价是LOAD_NAME,除非你先把list复制到本地,这样它才能被LOAD_FAST)。

最后,如果你想用iteritems来做(比方说,你使用的是一个坏的不太合规的Python解释器,它每次都随机化迭代顺序),你可以用zip来做。

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

这就把一连串的对变成了一连串的序列。

你可以直接在d上调用"".join(),而不调用.iterkeys,尽管你已经说过,像 list(d) 这样的东西会更有效,而且在python 3中,脚本的不同运行可以改变键和值的顺序,这是与python 2不同的行为。
@PadraicCunningham:是的,我想 ','.join(list(d)) 可能是CPython 2.7中最有效的。如果有人真的关心,我会测试所有的可能性,但我怀疑有人会这样做。无论如何,为了与 itervalues() 并行,我认为 iterkeys() 在这里更容易阅读。
@PadraicCunningham:至于运行之间的顺序,实际上,Python从来没有保证过每次运行都能得到相同的顺序。2.7和3.4对顺序的措辞几乎完全相同。的确,CPython 3.4 默认对字符串使用哈希随机化,而 2.7 (和 3.3) 没有,但是 Jython 2.5 已经在每次运行中给你一个不同的顺序,同时,有讨论说在 CPython 3.5 中默认保留 dict 的插入顺序 (甚至可能要求其他实现),所以这不是真正的 Python 2 vs. Python 3 的问题。
@abarnet ,我一直认为在cpython 2.7上,至少对于字符串和整数,你在不同的运行中总是会得到相同的顺序。
@PadraicCunningham:是的,但这是一些特定的实现,而不是2.x-vs.-3.x的区别。CPython 1.0-3.3有一种表现,CPython 3.4有另一种表现,CPython 3.5可能有另一种表现,Jython 2.2-2.5有另一种表现,我不知道IronPython或Skulpt等的情况。你不应该认为 "Python 2 "意味着 "在不同的运行中具有相同的顺序",或者 "Python 3 "意味着 "随机的顺序"。
miindlek
miindlek
发布于 2019-06-10
0 人赞同

You could do it like this:

key_string = ','.join(dict.keys()) 
val_string = ','.join(dict.values())
    
Rohit Mistry
Rohit Mistry
发布于 2019-06-10
0 人赞同

使用相同的函数 str.join(iterable) ,如果字典中的值不全是字符串,那么使用 列表理解速记法 :

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

Output: