如果第 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 ... 或介于两者之间的任何东西。 你如何区分nameaddress3(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 个元素拆分的主要内容,如果未能解决你的问题,请参考以下文章

根据列表项的索引模数执行不同的操作

我如何以向量化方式对矩阵中的每个第n个元素求平均?

算法(插入排序----手写5种方法)

python 排序 sorted 如果第一个条件 相同 则按第二个条件排序

急求!!!用c语言编写一个qsort函数,要求是对一个二位数组按每一个元素最后一个元素从小到大排序

Leetcode题目215.数组中的第K个最大元素(中等)