怎么用python样式写这个例子?

时间:2012-04-18 19:32:26

标签: python

我刚刚在PHP之后学习python,而且它的python风格对我来说非常奇怪。 我正在征求意见,你如何在python上编写这段代码:

data = []
for line in file:
  name, surname, phone, address, email, etc = line.split(";", 6)
  data.append( {'nick': nick, 'surname': surname, 'phone': phone, 'address': address, 'email':  email, 'etc': etc} )

我的代码看起来像PHP -_-

4 个答案:

答案 0 :(得分:4)

没关系。当然,你可以这样做:

data.append(dict(zip(('name', 'surname', 'phone', 'address', 'email', 'etc'),
                     line.split(";", 6))))

但你的变体更具可读性。

答案 1 :(得分:4)

你的代码看起来像php,因为你正在重新发明轮子。不要!

import csv

fieldnames = ['name', 'surname', 'phone', 'address', 'email']

with open('something', 'r') as f:
    data = list(csv.DictReader(f, fieldnames, delimiter=';'))

答案 2 :(得分:2)

我会使用函数进行解析,然后使用map()在每一行调用它:

def _parse_user_line(line):
    name, surname, phone, address, email, etc = line.split(';', 6)
    return {'nick': nick, 'surname': surname, 'phone': phone, 
            'address': address, 'email':  email, 'etc': etc}

data = map(_parse_user_line, file)

将返回的列表分配给单个变量然后只使用fields[0]fields[1]等也可能是个好主意。 - 无论如何它们都会在dict键旁边,所以每个人都知道什么他们是:

def _parse_user_line(line):
    u = line.split(';', 6)
    return {'nick': u[0], 'surname': u[1], 'phone': u[2], 
            'address': u[3], 'email': u[4], 'etc': u[5]}

data = map(_parse_user_line, file)

现在我们可以通过结合Roman's answer

的想法来使这更好
labels = 'nick surname phone address email etc'.split()
def _parse_user_line(line):
    values = line.split(';', 6)
    return dict(zip(labels, values))
data = map(_parse_user_line, file)

永远不要忘记(一行)The Zen of Python(又名import this):可读性计数。

答案 3 :(得分:0)

您可以在此处使用列表理解:

[{'nick': nick, 'surname': surname, 'phone': phone, 'address': address, 'email':  email, 'etc': etc} for name, surname, phone, address, email, etc in (line.split(";", 6) for line in file)]

然而,由于它的长度,这很难阅读。

要构建数据,您可以使用collections.namedtuple或生成字典的函数(如ThiefMaster's answer中所示)。

此处的另一种解决方案是创建一个用于保存数据的类:

def Person:
   def __init__(self, nick, surname, phone, address, email, etc):
       self.nick = nick
       self.surname = surname
       ...

然后使用splat运算符构建列表以解压缩值:

data = [Person(*line.split(";", 6)) for line in file]

这适用于您打算对数据进行更多工作的地方 - 这里的经验法则是,如果您不使用任何方法处理数据,则类比您需要的更强大。如果你这样做,那可能是值得的。