【问题标题】:how to split a list by 2nd recurrence如何通过第二次重复拆分列表
【发布时间】:2021-01-24 05:49:46
【问题描述】:

对不起,如果标题令人困惑,我希望我的解释会更清楚。我也有一个工作方法,但我希望它可以改进,特别是因为有一个缺陷。我还根据我的能力广泛搜索了我的问题,但没有找到与之匹配的内容。

所以我有以下看起来像的字典列表

names = [
  {"name" : "1231 GROUP LLC,.", "address": ""},
  {"name" : "Brick Pizza", "address": ""},
  {"name": "Zone Fitness", "address": ""},
  {"name": "Alderson, Kevin", "address": ""},
  {"name": "Alderson, Joanne", "address": ""}
  {"name": "Ave, John", "address": ""},
  {"name": "Zow, Peter", "address": ""}
]

前三个条目是企业,后三个是个人。我试图通过他们的密钥 name 以及他们是企业还是个人来拆分它们[如,按企业与个人排序]

众所周知,数据集以企业开头,然后是个人,并且每个集合都按字母数字 [或字母顺序] 排序。个人的名字中不能有数字,因此该集合的第一部分 [企业] 是字母数字,而个人则严格按字母顺序排列,但可能更愿意将两者都视为字母数字,特别是因为缺陷 [解释如下]。

其次,需要注意的是,名字中的第一个字符可能会再次重复,即三个人的姓氏以 A 开头,但考虑到他们的全名,Alderson 排在 Ave 之前。另外,两个人有完全相同的姓氏。同样的情况也可能发生在业务部门。它不应该在业务下的“A”第二次重复出现时拆分,而是在字母表循环后的第一次重复出现时拆分。

如前所述,我确实有一种工作方法,但我认为它效率低下并且是一种黑客行为。参数响应是一个字典列表,它们都具有相同的键,其中一个键是“名称”。

def sort_politics(response):   
    #names is also equal to the the list-dict format provided.
    names = [v for dic in response for k, v in dic.items() if k == 'name']
    first_name = names[0]
    second_name = ""
    for name in names:
        if name == first_name:
            continue
        if name >= second_name:
            second_name = name
        elif name <= second_name:
            print("start's over with {0}".format(name))
            second_name = name
            break
        continue
    businesses = response[0:names.index(second_name)]
    individuals = response[names.index(second_name):]
    print(businesses)
    print(individuals)

我将其视为 hack 的原因是它实际上并没有对 dicts 列表进行排序,而是从 dicts 列表中提取每个名称,然后使用 for 循环和 if 条件对其进行排序。然后,我必须找到将其拆分的索引。此外,还有一个缺陷是它只会分裂一次。从理论上讲,如果字母数字要在个人之后重置,它会按照第 16 行(或者如果您计算注释,则为第 17 行)包含在个人中。

【问题讨论】:

    标签: python python-3.x list sorting


    【解决方案1】:

    我相信这应该做你想做的事:

    def sort_politics(response):
        businesses = []
        individuals = []
    
        current_name = response[0]['name']
    
        for index, item in enumerate(response):
            if item['name'] < current_name:
                businesses = response[:index]
                individuals = response[index:]
                break
            else:
                current_name = item['name']
    
        return businesses, individuals
    

    因此,我没有制作一个全新的名称列表,而是逐个字典地浏览列表,然后比较名称属性。

    如果名称小于current_name(首先设置为第一个字典的名称),则我们根据项目的索引设置企业和个人列表并跳出 for 循环。否则,他们的名字被设置为current_name

    【讨论】:

    • inidividuals = [] 行在技术上不是必需的,但有助于清晰并防止在response 中找不到任何人时出现错误。
    • 性能稍高的版本是完全跳过businesses.append,在break之后返回response[:i], response[i:]
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多