繁体   English   中英

从列表中删除相似的句子

[英]Remove similar sentences in a list

假设我有一个文件,其中包含姓名,电话,生日等数据,并且某些行中包含(不包含)这些数据:

John || <missing_bday> || 92475123

我正在尝试编写一个脚本,该脚本将使用电话号码作为标记在这些行之间进行选择,因为它是必填字段,并且是唯一的(在列表中),并且所有行都有它,因此如果其中一个的len()大于其他我将其附加到新列表中。 我该怎么做? 我已经将这些行解析为一个列表,并且考虑过使用一些循环,列表中每个项目的索引并与另一个进行比较,但是名称长度有所不同。 这只是一个例子,实际行中有一些垃圾编号,如创建的日期,最后一小时, endswith()无效。

list = ["|| 19 || 99210831 ", "John || 19 || 83291234", "Angelica |||| 99210831", "|||| 99210831"
newlist = []

这遍历每一行并获取数据,然后构建字典。

这意味着它可以将许多记录中每个电话号码的最长名称和最长年龄组合在一起。 然后将它们全部打印出来。

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))

注意 命名列表list是一个坏习惯,因为该名称在Python中已经意味着其他含义。 (这是内置的list()函数)

像这样吗 您最终可以修改打印方式。

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
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("|")))

首先,将所有具有相同末端的条目归为一组,然后选择最佳条目...将最佳条目定义为具有最大值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM