如果第 5 个元素是“名称”,则按每第 4 个元素拆分列表;如果第 5 个元素是地址,则按第 5 个元素拆分
Posted
技术标签:
【中文标题】如果第 5 个元素是“名称”,则按每第 4 个元素拆分列表;如果第 5 个元素是地址,则按第 5 个元素拆分【英文标题】:Split the list by every 4th element if 5th element is "Name" or split by 5th element if 5th element is Address 【发布时间】:2019-11-02 15:20:45 【问题描述】:我有一个 8000 个名称列表,其中包含按如下所示顺序排列的名称、公司、地址 1、地址 2、地址 3(可选)。这是一个python列表
[John
It Tech
1243 mary drive
florida-32006
mark
Infotech
1245 lonely drive
irony estate 324
Virginia-24531
Steve
king Electronics
.
.
]
address3 是可选的,不能期望它每次都按顺序排列。name 将从 address2 的下一个开始。我需要按每个第 n 个元素拆分列表,即通过名称检查第 5 个元素是名称或地址。如果是地址,则将拆分增加 nth+1。如果没有,继续 4。我只是想将这些添加到 excel 列中。
下面是我尝试过的代码,它按每 4 个元素拆分列表。如果第 5 个元素是名称或地址,它会忽略。
test2= [final1[x:x+4] for x in range(0, len(final1),4)]
这给了我结果
[['John','It Tech','1243 mary drive','florida-32006'],
['mark','Infotech','1245 lonely drive','irony estate 324'],
['Virginia-24531','Steve','king Electronics']]
** the last list should start from Steve and the address(Virginia-24531) in the previous list***
我恳请有人帮我解决这个问题。提前非常感谢你
【问题讨论】:
如何区分'mark'
和'Virginia-24531'
的名称?如果你解决了你就差不多完成了......
顺便说一句,您的列表不是 python 列表 - 它是 NameError 正在发生...或 SyntaxError ... 或介于两者之间的任何东西。
你如何区分name
和address3(optional)
?
我已经定义了一个函数来查看它是否有数字或邮政编码def hasNumbers(inputString): return any(char.isdigit() for char in inputString)
这与数据框或熊猫有什么关系?
【参考方案1】:
下面的假设是地址有连字符而名称没有(非常危险)。然后它会根据最后一个条目 [-1] 是地址还是名称来剪切列表的前 4 个或 5 个元素。
result=[]
for x in range(len(final1)):
tmp = final1[:5] if len(final1) >= 5 else final1
if len(tmp)==0:
break
if '-' in tmp[-1]:
result.append(tmp)
final1 = final1[5:]
else:
result.append(final1[:4])
final1 = final1[4:]
result
[['John', 'It Tech', '1243 mary drive', 'florida-32006'],
['mark','Infotech','1245 lonely drive','irony estate 324','Virginia-24531'],
['Steve', 'king Electronics']]
【讨论】:
【参考方案2】:您的地址似乎包含数字 - 您的 姓名* 没有。您可以使用它进行相应的拆分:
from string import digits
def splitIt(data):
i = 0
tmp = []
for d in data:
# the first 4 lines we add without check - datasets have always 4 lines minimum
if i > 3: # this will break if you have data with fewer then 4 lines
if not any(c in digits for c in d): # if the 5th line has no numbers: NAME
yield tmp
tmp = [d]
i = 1
else: # else another address line, check 6th
tmp.append(d) # line for name (you can have as many
i += 1 # lines with numbers in it after the 4th)
yield tmp
data = ["John", # no number
"It Tech",
"1243 mary drive", # has number
"florida-32006", # has number
"mark", # no number
"Infotech",
"1245 lonely drive",
"irony estate 324",
"Virginia-24531",
"Steve",
"king Electronics",]
print(list(splitIt(data)))
输出:
[['John', 'It Tech', '1243 mary drive', 'florida-32006'],
['mark', 'Infotech', '1245 lonely drive', 'irony estate 324'],
['Steve', 'king Electronics']]
免责声明:Falsehoods Programmers Believe About Names
【讨论】:
您的代码运行良好。我需要更多帮助。有时我将国家或城市名称作为名称之前的最后一行。我有所有县市的清单。我们是否能够检查 te 值是否存在于此列表中并进行递增直到找到名称?所以逻辑是“如果我们的值没有数字或者它不是国家列表中的值之一,则拆分。它肯定是名称。非常感谢上面的代码。对不起,如果我听起来很愚蠢。我正在处理脏数据 @reddy 你可能会。将它们放入一组并检查它们。问题:一些城市名称也可能是人名:'Charlston'
, 'Houston'
, ... - 将此代码修改为可行的:)
嗨帕特里克,谢谢。我将制作一组城市和国家并检查结果。谢谢你的时间。非常感谢!以上是关于如果第 5 个元素是“名称”,则按每第 4 个元素拆分列表;如果第 5 个元素是地址,则按第 5 个元素拆分的主要内容,如果未能解决你的问题,请参考以下文章
python 排序 sorted 如果第一个条件 相同 则按第二个条件排序