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)

今、私たちはローマの答えからのアイデアを組み込むことによってこれをさらに良くすることができます:

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 に答える