0

我只是在 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

4 回答 4

4

没关系。当然,您可以执行以下操作:

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

但您的变体更具可读性。

于 2012-04-18T19:37:25.490 回答
4

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

import csv

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

with open('something', 'r') as f:
    data = list(csv.DictReader(f, fieldnames, delimiter=';'))
于 2012-04-18T19:44:56.573 回答
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 的回答中的想法来使它变得更好:

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)

永远不要忘记(来自 Python 之禅的一行)import this可读性很重要。

于 2012-04-18T19:37:10.400 回答
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或 一个产生 dict 的函数(如ThiefMaster 的回答)。

这里的另一种解决方案是创建一个类来保存您的数据:

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]

这适用于您打算对数据进行更多工作的情况 - 这里的经验法则是,如果您不使用任何方法来处理数据,那么类的功能将超出您的需要。如果你这样做,它可能是值得的。

于 2012-04-18T19:35:48.323 回答