我们说我有一个包含姓名,电话,生日等数据的文件,有些行带有和不带(部分)这些数据:
John || <missing_bday> || 92475123
我试图编写一个脚本,可以在这些行之间选择使用电话号码作为标记,因为它是必填字段和唯一(在列表中)并且所有行都有它,然后如果{ {1}}一个比另一个大,我会把它添加到一个新列表中。我该怎么办?我已经将这些行解析为列表,我考虑使用一些循环,列表中每个项目的索引,并与另一个进行比较,但名称长度不同。这只是一个例子,真实的行有一些垃圾编号,因为创建了acc日期,最后一小时,len()
woulnd&work。
endswith()
答案 0 :(得分:1)
这会遍历每一行并获取数据,然后构建一个字典。
这意味着它可以将许多记录中的每个电话号码的最长名称和最早年龄组合在一起。然后在最后打印出来。
data_in = ["|| 19 || 99210831 ", "John || 19 || 83291234", "Angelica |||| 99210831", "|||| 99210831"]
data = {}
for line in data_in:
line_parts = line.replace(' ','').split('||')
name_in, age_in, tel_in = line_parts[:3]
saved_name, saved_age = data.get(tel_in, ('',0))
if len(name_in) > len(saved_name):
saved_name = name_in
if age_in > saved_age:
saved_age = age_in
data[tel_in] = (saved_name, saved_age)
for tel, (name, age) in data.items():
print '||'.join((name, age, tel))
NB。命名你的列表list
是一个坏习惯,因为这个名字已经意味着Python中的其他东西。 (它是内置list()
功能)
答案 1 :(得分:1)
这样的东西?您可以在最后修改打印方式。
import re
lines = ['|| 19 || 99210831 ',
'John || 19 || 83291234',
'Angelica |||| 99210831',
'|||| 99210831']
directory = {}
for line in lines:
fields = re.split("\s*\|\|\s*", line)
phone = fields[2].split()[0] # Get phone number only
if phone not in directory:
directory[phone] = []
directory[phone].append(line)
for phone, records in directory.iteritems():
print "Records for phone: " + phone
for record in records:
print " " + record
print
答案 2 :(得分:0)
lines = sorted(open("file.dat"),key=lamda x:x.rsplit("|",1)[-1])
g = itertools.groupby(lines,lambda line:line.rsplit("|",1)[-1])
for key,result in g:
print max(g,key=lambda x:len(filter(None,line.split("|")))
首先将所有具有相同结尾的条目分组 然后,这将选择最佳...最佳定义为具有最多值