吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1010|回复: 12
收起左侧

[求助] 向大家请教一下用python写一个分组算法怎么写?

[复制链接]
netspirit 发表于 2023-6-15 01:19
本帖最后由 netspirit 于 2023-6-15 01:20 编辑

假如原本列表A里面有一万个数据,而且每个数据带有一个属性。属性可能是0,1,2
要求从列表里面的第一个数据开始。创建一个新列表B。
1.如果下一个数据的属性是0,那么就创建一个新列表。然后把这两个数据都放在新列表里面。然后再看下一个数据。如果下一个数据的属性还是0,那么就继续把下一个数据按顺序放到刚刚创建的列表里面。持续这么做直到下一个数据的属性不是0 然后再把刚才创建的这个列表放进b里面。同时给这个列表备注一个属性0。(注意是给新创建的列表备注属性不是给原来的数据更改属性)同时给这个列表备注一个数据总数。
2.如果下一个数据属性是1而上一个数据属性是0,那么就继续看下一个数据。如果两个数据属性为0的数据之间存在属性为1的数据不超过2个,那么就把这两个数据放到一个新建的列表里面。然后无视中间属性为1的数据。然后给这个新的列表备注属性为1,同时给这个列表备注原本的数据总数量。(比如(a,0),(b,1),(c,1),(d,0).一共4个数据。中间丢弃了两个。那么要把a,d按顺序放到一个新列表里面,同时给这个列表备注一个属性1,同时给这个列表备注原本数据的总量(4个),然后再把新列表放到B里面。
同时要保留一些弹性,比如间隔2个属性为1的数据有可能会改成间隔3个属性为1的数据。
3.如果有连续超过2个数据属性为1或者2的数据,那么就新建一个列表然后把这些数据按顺序放到新列表中,同时给这个新列表备注一个属性2.然后再把这个新列表放到B里面。同时备注这个列表里面的数据总个数。
4.新列表B里面的子列表的每一组数据都需要从上一个上一个的结尾开始。
比如[0,0],[1,0],[2,0],[3,1],[4,1],[5,0],[6,0],[7,2],[8,1],[9,0]这样一组数据。第一个是数据,第二个是属性。
那么分组以后:
第一组:[0,1,2] 标记为0 数量3
第二组:[2,5] 标记为1 数量4
第三组:[5,6] 标记为0 数量2
第四组:[6,7,8] 标记为2 数量3
第五组:[8,9] 标记为0 数量2
5.如果持续属性为0的数据超过100个,那么就要单独分一组。
比如假如两百个数据连续属性为0
那么第0-99个分一组
99-198个分一组
198-199个分一组 属性都标记成0


感谢大家的回答 有好的回答都给你加热心哈~~~

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
为之奈何? + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

aisme 发表于 2023-6-15 07:23
[Java] 纯文本查看 复制代码
A = [(0,0), (1,0), (2,0), (3,1), (4,1), (5,0), (6,0), (7,2), (8,1), (9,0)] # 原始列表A
B = [] # 新列表B
group = [] # 当前分组
group_type = None # 当前分组的属性
group_count = 0 # 当前分组的数据总数
zeros_count = 0 # 连续属性为0的数据总数

for i in range(len(A)):
    data, attr = A[i]
    
    if attr == 0:
        zeros_count += 1
        
        if len(group) == 0 or group_type == 0:
            group.append(data)
            group_type = 0
            group_count += 1
        else:
            B.append((group, group_type, group_count))
            group = [data]
            group_type = 0
            group_count = 1
    elif attr == 1 and group_type == 0 and i > 0 and A[i-1][1] == 0:
        j = i + 1
        while j < len(A) and A[j][1] == 1:
            j += 1
        if j - i <= 3:
            group.append(data)
            group_count += 1
        else:
            B.append((group, group_type, group_count))
            group = [data]
            group_type = 1
            group_count = 1
    elif attr == 2 or attr == 1 and (group_type == 1 or group_type == 2):
        group.append(data)
        group_type = attr
        group_count += 1
        
    if zeros_count > 100:
        B.append((group, group_type, group_count))
        group = []
        group_type = None
        group_count = 0
        zeros_count = 0

if len(group) > 0:
    B.append((group, group_type, group_count))

print(B)



试一下

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
netspirit + 1 + 1 热心回复!过会我研究下

查看全部评分

zysyijia 发表于 2023-6-15 07:25
要把这个需求读明白就得很长时间,可能简单点儿大家还有时间去想

免费评分

参与人数 1热心值 +1 收起 理由
netspirit + 1 可是需求就是这么复杂啊

查看全部评分

sunsjw 发表于 2023-6-15 08:46
老师经你布置作业,你又给我们布置作业。

免费评分

参与人数 1吾爱币 +1 收起 理由
netspirit + 1 这个不是“作业”

查看全部评分

kurama1982 发表于 2023-6-15 08:54
[Python] 纯文本查看 复制代码
def group_data(data):
    B = []
    temp = []
    count = 0
    for i in range(len(data)):
        if data[i][1] == 0:
            temp.append(data[i][0])
            count += 1
            if count == 100:
                B.append((temp[:], 0, len(temp)))
                temp = []
                count = 0
        elif data[i][1] == 1:
            if len(temp) > 0:
                gap = 0
                for j in range(i, len(data)):
                    if data[j][1] == 0:
                        break
                    gap += 1
                if gap <= 2:
                    temp.append(data[i-gap][0])
                    temp.append(data[j][0])
                    B.append((temp[:], 1, gap+2))
                    temp = []
                    count = 0
                    i = j
        elif data[i][1] == 2:
            if len(temp) > 0:
                B.append((temp[:], 0, len(temp)))
                temp = []
                count = 0
            gap = 0
            for j in range(i, len(data)):
                if data[j][1] != 2:
                    break
                temp.append(data[j][0])
                gap += 1
            B.append((temp[:], 2, gap))
            temp = []
            count = 0
            i = j-1
    if len(temp) > 0:
        B.append((temp[:], 0, len(temp)))
    return B

data = [(0,0),(1,0),(2,0),(3,1),(4,1),(5,0),(6,0),(7,2),(8,1),(9,0)]
B = group_data(data)
for group in B:
    print(f"第{B.index(group)+1}组:{group[0]} 标记为{group[1]} 数量{group[2]}")

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
netspirit + 1 + 1 热心回复!过会我研究下

查看全部评分

 楼主| netspirit 发表于 2023-6-15 09:36
sunsjw 发表于 2023-6-15 08:46
老师经你布置作业,你又给我们布置作业。

这不是什么老师布置的作业 这是我整理自己的东西遇到的问题
szkt1314 发表于 2023-6-15 11:03
[Python] 纯文本查看 复制代码
def create_new_list(A):
    B = []
    sublist = []
    sublist_property = -1  # 记录当前子列表的属性
    sublist_count = 0  # 记录当前子列表的数据总数

    for data, prop in A:
        if prop == 0:
            if sublist_property == 0 or sublist_count >= 100:
                # 单独分一组
                if sublist:
                    B.append((sublist, sublist_property, sublist_count))
                sublist = []
                sublist_property = 0
                sublist_count = 0
            sublist.append(data)
            sublist_count += 1
        elif prop == 1 and sublist_property == 0:
            sublist.append(data)
            sublist_count += 1
        elif prop == 2 and (sublist_property == 1 or sublist_property == 2):
            sublist.append(data)
            sublist_count += 1
        elif sublist:
            B.append((sublist, sublist_property, sublist_count))
            sublist = []
            sublist_property = -1
            sublist_count = 0

    if sublist:
        B.append((sublist, sublist_property, sublist_count))

    return B

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
netspirit + 1 + 1 谢谢@Thanks!

查看全部评分

law.liu 发表于 2023-6-15 13:59
希望帮到你!
[Python] 纯文本查看 复制代码
def create_new_list(A):
    B = []  # 创建一个新列表B,用于存储分组后的数据
    current_list = []  # 用于存储当前正在构建的子列表
    current_attr = None  # 用于存储当前子列表的属性
    attr_count = 0  # 用于统计当前子列表中的数据数量

    for data, attr in A:
        if attr == 0:  # 如果属性为0
            if current_attr != 0:  # 如果前一个属性不是0,说明需要创建新的子列表
                if current_list:  # 如果当前子列表不为空,表示已经构建好一个子列表
                    current_list.append(attr_count)  # 将上一个子列表的数据数量添加到子列表末尾
                    B.append(current_list)  # 将上一个子列表添加到列表B中

                current_list = [data]  # 创建新的子列表,并添加当前数据
                current_attr = attr  # 更新当前子列表的属性
                attr_count = 1  # 重置数据数量为1
            else:
                current_list.append(data)  # 将当前数据添加到当前子列表
                attr_count += 1  # 增加数据数量
        elif attr == 1:  # 如果属性为1
            if current_attr == 0:  # 如果前一个属性是0
                if attr_count <= 2:  # 如果属性为0的数据不超过2个
                    current_list.append(data)  # 将当前数据添加到当前子列表
                    attr_count += 1  # 增加数据数量
                else:
                    current_list.append(attr_count)  # 将上一个子列表的数据数量添加到子列表末尾
                    B.append(current_list)  # 将上一个子列表添加到列表B中

                    current_list = [data]  # 创建新的子列表,并添加当前数据
                    current_attr = attr  # 更新当前子列表的属性
                    attr_count = 1  # 重置数据数量为1
            else:
                current_list.append(data)  # 将当前数据添加到当前子列表
                attr_count += 1  # 增加数据数量
        else:  # 如果属性为2
            if current_attr != 2:  # 如果前一个属性不是2,说明需要创建新的子列表
                if current_list:  # 如果当前子列表不为空,表示已经构建好一个子列表
                    current_list.append(attr_count)  # 将上一个子列表的数据数量添加到子列表末尾
                    B.append(current_list)  # 将上一个子列表添加到列表B中

                current_list = [data]  # 创建新的子列表,并添加当前数据
                current_attr = attr  # 更新当前子列表的属性
                attr_count = 1  # 重置数据数量为1
            else:
                current_list.append(data)  # 将当前数据添加到当前子列表
                attr_count += 1  # 增加数据数量

    if current_list:  # 处理最后一个子列表
        current_list.append(attr_count)  # 将最后一个子列表的数据数量添加到子列表末尾
        B.append(current_list)  # 将最后一个子列表添加到列表B中

    return B  # 返回分组后的列表B


# 示例数据
A = [
    (0, 0), (1, 0), (2, 0), (3, 1), (4, 1),
    (5, 0), (6, 0), (7, 2), (8, 1), (9, 0)
]

# 调用函数创建新列表B
B = create_new_list(A)

# 打印结果
for sublist in B:
    print(sublist)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
netspirit + 1 + 1 你是怎么想出来的啊

查看全部评分

hazs 发表于 2023-6-15 15:01

老师经你布置作业,你又给我们布置作业。
kll545012 发表于 2023-6-15 15:20
我觉得,上面不少是GPT直接给出的结果的样子~~~注释的清清楚楚

免费评分

参与人数 1热心值 +1 收起 理由
netspirit + 1 没一个能用的 全都不靠谱

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表