鱼C论坛

 找回密码
 立即注册
查看: 3455|回复: 24

[已解决]列表分割

[复制链接]
发表于 2021-4-28 16:40:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 逃兵 于 2021-4-28 22:23 编辑

有一个列表 L = [3, 4, 6, 10, 2, 7, 1, 5, 8, 9]
现在想把它切成如下新列表
[[3, 4, 6, 10], [3, 4, 6, 7, 8, 9], [3, 4, 5, 8, 9]]
规则是新列表中的每个元素都是一直升序的
原列表10个元素以内,可以为空列表,里面的元素为1~10并且各不相同
新列表中各个元素的第一个元素为原列表的一个元素
[3,7,8,9]不算,因为3和7之间还有4,6,只算[3,4,6,7,8,9]
[3,4,6]不算,因为后面还有10,只算[3,4,6,10]
[1,5,8,9]不算,因为不以原列表的第一个元素3为开头





test2:
[4, 7, 6, 1, 3, 5, 8, 2]
[[4, 7, 8], [4, 6, 8], [4, 5, 8]]

test3:
[10, 7, 5, 8, 9, 4, 1, 6, 2, 3]
[[10]]

test4:
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]
[[1,7,10],[1,7,8,9],[1,5,10],[1,5,8,9],[1,5,6,9],[1,2,4,6,9],[1,3,6,9]]

test5:
[2, 7, 3, 6, 10, 8, 5, 4, 1, 9]
[[2,7,10],[2,7,8,9],[2,3,6,10],[2,3,6,8,9],[2,3,5,9],[2,3,4,9]]

test6:
[1,3,2,4]
[[1,3,4],[1,2,4]]

test7:
[1,4,5,3,2]
[[1,4,5],[1,3],[1,2]]

最佳答案
2021-4-28 18:21:26
再看看
import itertools,random

lst = [1,2,3,4,5,6,7,8,9,10]
data = random.sample(lst,len(lst))

print(data)

res = []
for i in range(len(data),0,-1):
    for j in itertools.combinations(data,i):
        if (list(j) == sorted(list(j)) and
            j[0] == data[0] and
            j[-1] >= max(data[data.index(j[-1]):])):
            isadd = True
            for k in res:
                if set(j).issubset(set(k)):
                    isadd = False
                    break
            if isadd:
                print(list(j))
                res.append(list(j))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-28 17:01:22 From FishC Mobile | 显示全部楼层
新列表要几个元素?你这范围也太广了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:06:20 From FishC Mobile | 显示全部楼层
test2:4,7算不算
46算不算
78算不算
358算不算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:06:58 | 显示全部楼层
qq1151985918 发表于 2021-4-28 17:01
新列表要几个元素?你这范围也太广了吧?

原列表10个元素以内,里面的元素为1~10并且各不相同
新列表中各个元素的第一个元素为原列表的一个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:11:45 | 显示全部楼层
hrp 发表于 2021-4-28 17:06
test2:4,7算不算
46算不算
78算不算

补充下哈,以原列表的第一个元素作为开头
这里我不太会形容,就是
[4,7]后面还有个8,只算[4,7,8]
[4,6]后面还有个8,只算[4,6,8]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:17:13 From FishC Mobile | 显示全部楼层
是最少3个元素最多10个元素吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:18:20 From FishC Mobile | 显示全部楼层
如果原列表是[1,2,3,4,5,6,7,8,9,10]你举个例子好吗?要列举全部还是列举几个?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:20:56 | 显示全部楼层
qq1151985918 发表于 2021-4-28 17:18
如果原列表是[1,2,3,4,5,6,7,8,9,10]你举个例子好吗?要列举全部还是列举几个?

最少0个元素也行,题目我补了几个test,可以参考一下题目的含义

[1,2,3,4,5,6,7,8,9,10]
[[1,2,3,4,5,6,7,8,9,10]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:24:41 | 显示全部楼层
我感觉你说的太模糊了,你列举的答案是全部吗?要求输出全部答案吗?
比如说
test4:
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]
[[1,7,10],[1,7,8,9],[1,5,8,9],[1,5,6,9],[1,2,4,6,9],[1,3,6,9]]

[1,5,8]算不算?[1,4,6]?[1,6,9]?感觉还有好多?你是要把结果全部输出吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:28:43 From FishC Mobile | 显示全部楼层
逃兵 发表于 2021-4-28 17:20
最少0个元素也行,题目我补了几个test,可以参考一下题目的含义

[1,2,3,4,5,6,7,8,9,10]

看了这个感觉更迷糊了,为什么别的例子可以截取其中一段,这个例子却不可以,是什么规则
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:29:04 | 显示全部楼层
qq1151985918 发表于 2021-4-28 17:24
我感觉你说的太模糊了,你列举的答案是全部吗?要求输出全部答案吗?
比如说
test4:

确实是我说的很模糊,我不知道该怎么表达
[1,5,8]不算,原列表后面还有9,只算[1,5,8,9]
[1,4,6]不算,原列表前面有2,后面有9,只算[1,2,4,6,9]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:45:39 | 显示全部楼层
hrp 发表于 2021-4-28 17:28
看了这个感觉更迷糊了,为什么别的例子可以截取其中一段,这个例子却不可以,是什么规则

因为1~9是连续的,没有中断过
只能切出来[1,2,3,4,5,6,7,8,9]
简单的例子
[1,3,2,4]
[[1,3,4],[1,2,4]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 17:47:54 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-4-29 08:38 编辑

暴力穷举法,抛砖引玉,等待大佬
import itertools,random

lst = [1,2,3,4,5,6,7,8,9,10]
data = random.sample(lst,len(lst))

print(data)

res = []
for i in range(len(data),0,-1):
    for j in itertools.combinations(data,i):
        if (list(j) == sorted(list(j)) and
            j[0] == data[0] and
            j[-1] >= max(data[data.index(j[-1]):])):
            isadd = True
            for k in res:
                if set(j).issubset(set(k)):
                    isadd = False
                    break
            if isadd:
                print(list(j))
                res.append(list(j))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 17:56:40 | 显示全部楼层
qq1151985918 发表于 2021-4-28 17:47
暴力穷举法,抛砖引玉,等待大佬

打个比方哈
用这个方法跑的实例
[7, 9, 5, 4, 2, 1, 10, 3, 8, 6]
[7, 10]
[7, 8]
[7, 9, 10]
把[7,10]去掉就对了(因为原列表中7与10中间还有个元素9)
[7,9,10],[7,8]满足
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 18:21:26 | 显示全部楼层    本楼为最佳答案   
再看看
import itertools,random

lst = [1,2,3,4,5,6,7,8,9,10]
data = random.sample(lst,len(lst))

print(data)

res = []
for i in range(len(data),0,-1):
    for j in itertools.combinations(data,i):
        if (list(j) == sorted(list(j)) and
            j[0] == data[0] and
            j[-1] >= max(data[data.index(j[-1]):])):
            isadd = True
            for k in res:
                if set(j).issubset(set(k)):
                    isadd = False
                    break
            if isadd:
                print(list(j))
                res.append(list(j))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 19:23:25 | 显示全部楼层
test4:
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]
[[1,7,10],[1,7,8,9],[1,5,8,9],[1,5,6,9],[1,2,4,6,9],[1,3,6,9]]

为什么【1,5,10】不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 19:59:28 | 显示全部楼层
本帖最后由 kogawananari 于 2021-4-28 20:25 编辑
class MyNode():
    def __init__(self, root, head=None):
        self.head = head
        self.root = root
        self.children = []
    
    def append_child(self, n):
        if not self.children:
            if n > self.root:
                self.children.append(MyNode(n, self))
            return
        if self.root < n < self.children[-1].root:
            self.children.append(MyNode(n, self))
        else:
            for node in self.children:
                node.append_child(n)
    
    def __repr__(self):
        if not self.children:
            return f'{self.root}'
        return f'{self.root}{self.children}'

class MyTree(MyNode):
    def __init__(self, nums):
        self.head = None
        self.root = nums[0]
        self.children = []
        for n in nums[1:]:
            self.append_child(n)
    
def lujing(node):
    lu = []
    def deeph(n):
        i = []
        while 1:
            i.insert(0,n.root)
            if n.head is None: break
            n = n.head
        return i
    def tannv(n):
        for i in n.children:
            if not i.children:
                lu.append(deeph(i))
            else:
                tannv(i)
    tannv(node)
    return lu

t = MyTree([1, 7, 5, 10, 8, 2, 4, 3, 6, 9])
print(lujing(t))

# 写死我了 思路是树(或者命名元组)的递归遍历 head确定父节点
# 我的结果[[1, 7, 10], [1, 7, 8, 9], [1, 5, 10], [1, 5, 8, 9], [1, 5, 6, 9], [1, 2, 4, 6, 9], [1, 2, 3, 6, 9]]
和你结果不太一样 因为你的题目有点自相矛盾  
为什么[3, 4, 6, 10, 2, 7, 1, 5, 8, 9]有[3, 4, 5, 8, 9]没有[3, 5, 8, 9]
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]没有[1, 2, 3, 6, 9]却有[1,3,6,9]

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
逃兵 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-28 20:02:30 | 显示全部楼层
逃兵 发表于 2021-4-28 17:56
打个比方哈
用这个方法跑的实例


按你这个例子来看,规律是不是:

以第一个元素为最小值,过滤出比它大的所有其他元素,然后升序排比。(假设得到 ls=[7,8,9,10])
然后
for i in range(len(ls)):
   print(ls[:i])

得到 [], [7], [7, 8], [7, 8, 9]    ——是这样?。。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 22:21:54 | 显示全部楼层
kogawananari 发表于 2021-4-28 19:23
test4:
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]
[[1,7,10],[1,7,8,9],[1,5,8,9],[1,5,6,9],[1,2,4,6,9],[1,3,6, ...

[1,5,10]可以,实例是我自己写的,就有疏忽了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-28 22:23:17 | 显示全部楼层
kogawananari 发表于 2021-4-28 19:59
和你结果不太一样 因为你的题目有点自相矛盾  
为什么[3, 4, 6, 10, 2, 7, 1, 5, 8, 9]有[3, 4, 5, 8,  ...

为什么[3, 4, 6, 10, 2, 7, 1, 5, 8, 9]有[3, 4, 5, 8, 9]没有[3, 5, 8, 9]
3和5之间有4,就不要[3, 5, 8, 9],只保留[3, 4, 5, 8, 9]
[1, 7, 5, 10, 8, 2, 4, 3, 6, 9]没有[1, 2, 3, 6, 9]却有[1,3,6,9]
1和3之间有2,不要[1, 3, 6, 9],保留[1, 2, 3, 6, 9]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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