鱼C论坛

 找回密码
 立即注册
查看: 10673|回复: 91

[技术交流] Python:每日一题 23(答题领鱼币)

[复制链接]
发表于 2017-4-8 15:41:36 | 显示全部楼层 |阅读模式

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

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

x
出一道简单的题。把一个嵌套的多维列表变为一维列表,如:
  1. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
复制代码

变为
  1. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
复制代码

方法越简单越好。


感谢@冬雪雪冬 提供的题目!(虽然我不会......)


游客,如果您要查看本帖隐藏内容请回复



欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@lumber2388779 @ooxx7788
点我上车

本帖被以下淘专辑推荐:

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

使用道具 举报

 楼主| 发表于 2017-4-8 15:42:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-8 16:41:47 | 显示全部楼层
  1. em=[] # 定义空列表
  2. def main(li):
  3.     global em #定义全局变量
  4.     for each in li:
  5.         x = isinstance(each, list) #判断元素是否是列表
  6.         if not x:
  7.             em.append(each)
  8.         else:
  9.             main(each) # 递归
  10.     return em
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

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

使用道具 举报

发表于 2017-4-8 16:57:09 | 显示全部楼层
  1. # -*- coding: utf -8 -*-

  2. def list_app(old_list, new_list = list()):
  3.     """#isinstance去判断遍历的l是不是还是一个list'
  4.     '如果还是list,用递归继续反复遍历'"""
  5.     for l in old_list:
  6.         if isinstance(l, list):  
  7.             list_app(l)     # 调用递归
  8.         else:
  9.             # 如果不是,把l添加进一个新的list
  10.             new_list.append(l)  
  11.     return new_list

  12. #开始工作
  13. oldlist = ['a0',['a1','a2'],['a3',['a4',['a5','a6'],'a7'],'a8'],['a9','a10']]
  14. print(list_app(oldlist))
复制代码


打印结果>>>['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10']
新手,用了递归可以很简单实现.

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

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

使用道具 举报

发表于 2017-4-8 16:59:31 | 显示全部楼层
  1. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  2. print(list1)
  3. print(list(map(int, str(list1).replace('[', '').replace(']', '').split(','))))
复制代码


一行够不够简单?
就是这样估计冬雪雪冬要骂我。

  1. [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  2. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

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

使用道具 举报

发表于 2017-4-8 17:01:25 | 显示全部楼层
dori233 发表于 2017-4-8 16:57
打印结果>>>['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10']
新手, ...

天才程序员用递归,你是天才!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-8 20:02:17 | 显示全部楼层
ooxx7788 发表于 2017-4-8 16:59
一行够不够简单?
就是这样估计冬雪雪冬要骂我。

很简单,我也仿照写一个。
  1. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  2. print([int(i.strip(' []')) for i in str(list1).split(',')])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-8 21:40:20 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-7-17 15:00 编辑
冬雪雪冬 发表于 2017-4-8 20:02
很简单,我也仿照写一个。

  1. def foo3(list1):
  2.     """
  3.     列表压平
  4.     """
  5.     flat = lambda L: sum(map(flat, L), []) if isinstance(L, list) else [L]
  6.     print(flat(list1))

  7. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  8. foo3(list1)
复制代码


其实还有这一种,也是一句完成,不过这是参照别人的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-8 21:50:00 | 显示全部楼层
冬雪雪冬 发表于 2017-4-8 20:02
很简单,我也仿照写一个。

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

使用道具 举报

 楼主| 发表于 2017-4-8 21:50:12 | 显示全部楼层
ooxx7788 发表于 2017-4-8 21:40
其实还有这一种,也是一句完成,不过这是参照别人的!

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

使用道具 举报

发表于 2017-4-8 22:11:11 | 显示全部楼层
本帖最后由 gopythoner 于 2017-4-8 22:13 编辑

来罗,看我的,曲线救国方法
  1. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  2. str1 = str(list1).replace("[","").replace("]","")
  3. str2 = "["+str1+"]"
  4. newlist = eval(str2)
  5. print(newlist)
复制代码


输出得到你要的,没毛病

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

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

使用道具 举报

发表于 2017-4-9 07:20:33 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-4-9 07:35 编辑

我也来写一个,上面用递归其实是深度优先搜索(DFS),那我就再写一个广度优先搜索(BFS)。广度优先搜索用循环可以达到递归同样的目的。
list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
newlist = []
while list1:
  sublist = list1.pop()
  if isinstance(sublist,list):
    list1.extend(sublist)
  else:
    newlist.insert(0,sublist)
print newlist

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 天啊~天才~

查看全部评分

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

使用道具 举报

发表于 2017-4-9 11:16:38 | 显示全部楼层
眼花缭乱!默默地转身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 15:06:15 | 显示全部楼层
Python 3.5.X
windows版的python都自带Tkinter模块

  1. from tkinter import _flatten
  2. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  3. print(list(_flatten(list1)))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-4-9 15:08:19 | 显示全部楼层
旁门左道ゝ 发表于 2017-4-9 15:06
Python 3.5.X
windows版的python都自带Tkinter模块

这这这...大佬啊...这tkinter怎么还有这用函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 16:24:28 | 显示全部楼层
旁门左道ゝ 发表于 2017-4-9 15:06
Python 3.5.X
windows版的python都自带Tkinter模块

这个函数我也不知道,学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 16:38:00 | 显示全部楼层
76666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 16:48:22 | 显示全部楼层
对于新手来说,小甲鱼说合适才是最好的,看到课后题 ,联想起 可以新建一个列表进行覆盖,你说可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 17:07:57 | 显示全部楼层
ljs9061 发表于 2017-4-9 16:48
对于新手来说,小甲鱼说合适才是最好的,看到课后题 ,联想起 可以新建一个列表进行覆盖,你说可以吗?

s获得具体点,举个例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 12:46:01 | 显示全部楼层
转换成字符串再处理
  1. list1 = [1, [2], [3, 4], [[5, 6], 7], [8, [[9, [10], 11], 12], 13]]
  2. list1=str(list1)
  3. list1=list1.replace('[','')
  4. list1=list1.replace(']','')
  5. list1=list1.replace(',','')
  6. list1=[int(i) for i in list1.split()]
  7. print(list1)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 如果是让用户输入呢

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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