【问题标题】:I have a list of names and i am trying to extract first name and last name from the list in python我有一个名字列表,我正在尝试从 python 列表中提取名字和姓氏
【发布时间】:2018-04-24 14:13:51
【问题描述】:

以下是我正在处理的代码,我无法从名称列表中提取名字和姓氏。代码不断给我错误太多的值来解压可能是因为例如这个名字 ELSWOCK Rick Jr 有第一个中间名和姓氏。这里 Rick Jr 应该是名字,Elswock 是姓氏。

names=[' HE XF, Wei W, Liu ZZ, Shen XL',' STARK LE, AARON FIN, LEO DE CAP, ADAM FORTH, KARAN SINGH',' ELSWICK RICK Jr, ASTO FON, SAM MARLON, KIM ZENG']
names1 = []
for l1 in names:
    names1.append(l1.split(',')) #To split the line based on commas
first_names=[]
last_names=[]
for line in names1:
    last,first= line[0][:].split()
    first_names.append(first)
    last_names.append(last)

导致此错误:

回溯(最近一次通话最后一次):
文件“”,第 10 行,在 last,first= line[0][:].split()

ValueError:解包的值太多(预计 2 个)

我期望的输出是这样的:

first_names=[ 'XF, W, ZZ, XL', 'LE, FIN, CAP, FORTH, SINGH', 'RICK Jr, FON, MARLON, ZENG' ]
last_names=[' HE, Wei, Liu, Shen',' STARK, AARON, LEO DE, ADAM, KARAN',' ELSWICK, ASTO, SAM, KIM']

【问题讨论】:

  • LEO DE CAP 将在line[0][:].split() 中为您提供LEODECAP。您需要指定要拆分的位置,这与这样的名称无关。
  • 输入应该是names=[' HE XF, Wei W, Liu ZZ, Shen XL',' STARK LE, AARON FIN, LEO DE CAP, ADAM FORTH, KARAN SINGH',' ELSWICK RICK Jr, ASTO FON, SAM MARLON, KIM ZENG'] 还是names=[' HE XF, Wei W, Liu ZZ, Shen XL STARK LE, AARON FIN, LEO DE CAP, ADAM FORTH, KARAN SINGH , ELSWICK RICK Jr, ASTO FON, SAM MARLON, KIM ZENG'] - 为什么在你的例子中有额外的','?
  • 使用(?<fn>\b[A-Z]+\b(?: +[A-Z]*[a-z]+[a-zA-Z]*)?(?=,|$)) 作为名字。从原始字符串中提取并替换它们。然后用空字符串替换^ | (?=,)清理剩余数据。
  • 还有,为什么LEO DE 是姓氏,而您提到Elswick Rick Jr 应该以不同方式处理?

标签: python regex list dictionary split


【解决方案1】:

编辑以适应 OP 的格式要求:

names=[' HE XF, Wei W, Liu ZZ, Shen XL',' STARK LE, AARON FIN, LEO DE CAP, ADAM FORTH, KARAN SINGH',' ELSWICK RICK Jr, ASTO FON, SAM MARLON, KIM ZENG']
names1 = []
for l1 in names:
    names1.append(l1.split(','))
first_names=[]
last_names=[]

for sub_list in names1:
  temp_sub_firsts ="" 
  temp_sub_lasts ="" 
  for full_name in sub_list:
    full_name_split = full_name.split(' ')
    full_name_split.pop(0)
    temp_sub_lasts += full_name_split.pop(0)
    if full_name != sub_list[-1]:
      temp_sub_lasts += ', '
    temp_first = ""
    for sub_first in full_name_split:
      temp_first += sub_first + ' '
    temp_sub_firsts += temp_first
    if full_name != sub_list[-1]:
      temp_sub_firsts += ', '
  first_names.append(temp_sub_firsts)
  last_names.append(temp_sub_lasts)
print(first_names)
print(last_names)

输出:

first_names[]=

['XF , W , ZZ , XL ', 'LE , FIN , DE CAP , FORTH , SINGH ', 'RICK Jr , FON , MARLON , ZENG ']

last_names[]=

['HE, Wei, Liu, Shen', 'STARK, AARON, LEO, ADAM, KARAN', 'ELSWICK, ASTO, SAM, KIM']

【讨论】:

  • 您好 Nathan 感谢您的回复,是的,它有效,但我希望答案是正确的索引,例如姓氏列表将是:['HE','Wei','Liu', 'shen'] 在列表索引 0 和姓氏列表索引 1 将是 ['STARK', 'AARON', 'LEO', 'ADAM', 'KARAN'] 并且索引 3 将具有 ['ELSWICK', 'ASTO ', 'SAM', 'KIM'] 和类似的名字。谢谢
  • 是的,输入带有空格,这是我创建的虚拟列表。但实际列表有 48 行,其中有一个空格。
  • 我已经编辑了答案以(希望)符合这些要求 - 仍有一些清理工作要做(删除额外/不需要的空格等)但这应该足以让你正确路径 - 祝你好运:)
  • 太棒了。此编辑后的代码与我的列表完美配合,非常感谢。非常感谢您的帮助。
【解决方案2】:

你也可以试试

names=[' HE XF, Wei W, Liu ZZ, Shen XL',' STARK LE, AARON FIN, LEO DE CAP, ADAM FORTH, KARAN SINGH',' ELSWICK RICK Jr, ASTO FON, SAM MARLON, KIM ZENG']
reg1=re.compile(r"\w+(?<!,)\s(?=(?!Jr)[\w ]+,?)")
reg2=re.compile(r'(?<!,)\s(?:(?!Jr|DE)[\w ]+(?=,?))')
first_names=[reg1.sub("",m.strip()) for m in names]
last_names=[reg2.sub("",m.strip()) for m in names]
print("{}\n{}".format(first_names,last_names))

输出是

['XF, W, ZZ, XL', 'LE, FIN, CAP, FORTH, SINGH', 'RICK Jr, FON, MARLON, ZENG']
['HE, Wei, Liu, Shen', 'STARK, AARON, LEO DE, ADAM, KARAN', 'ELSWICK, ASTO, SAM, KIM']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多