Python 更重要的是”;蟒蛇的使用列表生成器的dict压缩,还是显式for循环?

Python 更重要的是”;蟒蛇的使用列表生成器的dict压缩,还是显式for循环?,python,Python,假设我有一个输入“raw_data”的函数 原始数据由以下行组成: key1: str1 key2: str2 ... 其中,strx的形式为aa:bb:cc:dd.-这是一个“:”分隔字符串 有一个helper函数对字符串进行处理,将其转换为值,我们称之为get\u value() 返回dict的最具python风格的方式是什么 to_dict(raw_data): list_data = raw_data.splitlines() return { key.replac

假设我有一个输入“raw_data”的函数 原始数据由以下行组成:

key1: str1  
key2: str2  
...  
其中,strx的形式为aa:bb:cc:dd.-这是一个“:”分隔字符串 有一个helper函数对字符串进行处理,将其转换为值,我们称之为
get\u value()

返回dict的最具python风格的方式是什么

to_dict(raw_data):
  list_data = raw_data.splitlines()
  return { key.replace(':',''): get_value(str) for key,str in (line.split() for line in list_data)}

还是有更像蟒蛇的方法来做这件事?
我知道这似乎是一个基于观点的问题,但对于什么是“更具pythonic”或“不太具pythonic”的做事方式似乎存在共识,我只是不知道这种情况下的共识是什么。

如何:

{k:v for l in raw_data.splitlines() for (k,v) in [l.split(":")]}

列表理解确实是一种方便快捷的方法,可以在一行代码中用Python编写for循环。理解的思想不仅仅局限于Python中的列表。词典是数据科学中常用的数据结构之一,也可以进行理解。这称为听写理解或词典理解


请记住,在python中,列表是用方括号[]定义的,字典是用大括号{}定义的。同样的想法在定义听写理解时也被继承了下来。dict comprehension是用类似的语法定义的,但在表达式中有一个key:value对。

您的第一个表达式更“Pythonic”。如果您担心可读性,可以将生成器表达式放到自己的行中

def to_dict(raw_data):
    data = (line.split(': ', 1) for line in raw_data.splitlines())
    return {key: get_value(st) for key, st in data}

line.split(“:”,1)
将只在第一个
“:”
上拆分行,因此
“a:b:c”
变成
['a',b:c']

字典大小写是pythonic的方式。你的循环是向后的。它们从左到右执行。很抱歉,我忘了提到字符串中有“:”,更新了问题以反映这一点谢谢Patrick,是的,你说得很对-进行了相应的编辑更正-我还注意到我必须包装
l.split(:”)
列表括号中的组件以避免
值错误:没有足够的值来解包(预期为2,得到1)
尝试从拆分内容中填充(k,v)时遇到的错误。我承认,我不完全确定为什么这是必要的,但看起来在这种情况下是这样的。dict应该是key:value,但是这个答案对我来说非常有用,谢谢。
def to_dict(raw_data):
    data = (line.split(': ', 1) for line in raw_data.splitlines())
    return {key: get_value(st) for key, st in data}