鱼C论坛

 找回密码
 立即注册
查看: 1062|回复: 11

[已解决]请帮忙解决下这问题,实在想不出方法

[复制链接]
发表于 2018-8-14 22:23:56 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 丨游戏灬需要 于 2018-8-14 22:31 编辑

1,怎么一次获取序列的两个或以上的元素,例如:
(假设)
my_iterable = [1,1,2,3,5,8,13]
for i in my_iterable:
        print(i)

(以获取两个元素先为例)
第一次循环 i 得出的结果为 1,1
第二次循环 i 得出的结果为 2,3   \ 还有一种情况是 i 的结果为 1,3  ,好像有个函数能完成这种效果,但我忘了
第三次循环 i 得出的结果为 5,8
以此类推……

2,怎么让两个或以上的for循环同时运行,例如:
(假设) ps:这题尽量不是用这种方法解决 for i in zip(m1 ,m2):print (i),因为看上去这种方法还是有些缺陷(它产出的值是按最短的个数来算)

m1 = [1,1,2,3,5,8,13]
m2 = 'qweasdzxc'
for i in m1:
        for i2 in m2
                print (i ,i2)
第一次循环 i 得出的结果为 1,q
第二次循环 i 得出的结果为 1,w
第三次循环 i 得出的结果为 2,e
以此类推……
最佳答案
2018-8-14 22:23:57
我觉得你可能是需要itertools.zip_longest
  1. import itertools
复制代码


问题一,通过切片将原列表一分为二,再通过itertools.zip_longest一起迭代
  1. li = [1, 1, 2, 3, 5, 8, 13]
  2. print([i for i in itertools.zip_longest(li[::2], li[1::2])])
复制代码


问题二,这个itertools.zip_longest也可以实现
  1. li1 = list("abcdefg")
  2. li2 = list("1234567890")
  3. li3 = list("<>()?")
  4. print([[j for j in i if j] for i in itertools.zip_longest(li1, li2, li3)])
复制代码

最佳答案

查看完整内容

我觉得你可能是需要itertools.zip_longest 问题一,通过切片将原列表一分为二,再通过itertools.zip_longest一起迭代 问题二,这个itertools.zip_longest也可以实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-14 22:23:57 | 显示全部楼层    本楼为最佳答案   
我觉得你可能是需要itertools.zip_longest
  1. import itertools
复制代码


问题一,通过切片将原列表一分为二,再通过itertools.zip_longest一起迭代
  1. li = [1, 1, 2, 3, 5, 8, 13]
  2. print([i for i in itertools.zip_longest(li[::2], li[1::2])])
复制代码


问题二,这个itertools.zip_longest也可以实现
  1. li1 = list("abcdefg")
  2. li2 = list("1234567890")
  3. li3 = list("<>()?")
  4. print([[j for j in i if j] for i in itertools.zip_longest(li1, li2, li3)])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
丨游戏灬需要 + 3 + 3 + 2

查看全部评分

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

使用道具 举报

发表于 2018-8-14 22:40:08 | 显示全部楼层
第一个用切片或者索引值就行

你的第二个的想要的结果感觉一个循环就行了,用不到二重循环啊,都利用相同的索引就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-14 23:17:38 From FishC Mobile | 显示全部楼层
塔利班 发表于 2018-8-14 22:40
第一个用切片或者索引值就行

你的第二个的想要的结果感觉一个循环就行了,用不到二重循环啊,都利用相同 ...

我想的是用尽量少的代码完成,能用一条语句完成的话绝不用函数实现(写个符合条件的函数不难,但我看看有没有更高深的方法)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-14 23:33:33 | 显示全部楼层
my_iterable = [1,1,2,3,5,8,13]
for i in range(1,len(my_iterable),2):
    print(my_iterable[i-1],my_iterable[i])
if len(my_iterable)%2 == 1:      #这个看你要不要
    print(my_iterable[-1])


m1 = [1,1,2,3,5,8,13]   # 这种做法,必须一样长
m2 = 'qweasdz'            #这种做法,必须一样长
for i in range(len(m1)):
    print(m1[i],m2[i])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-15 15:44:33 From FishC Mobile | 显示全部楼层
第四时空 发表于 2018-8-15 12:52
我觉得你可能是需要itertools.zip_longest



这个可以,虽然是import函数了,但效果上已经很接近了。如果没有别的既简单又简洁的写法的话,那么就可以选你这个了。我想看看有没有利用原始操作(如课后题中在没有三元操作符时,有人利用not,and,or来模拟出三元),依靠逻辑解决出这问题的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-16 21:04:13 | 显示全部楼层
引入步长参数,想取多少就设多少的步长;引入一个循环变量,循环变量的增长和步长相同,然后每次循环用索引取元素就行了.怕出错可用异常进行处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-17 08:12:40 | 显示全部楼层
my_iterable = [1,1,2,3,5,8,13,21,34]

temp = iter(my_iterable)
for i in temp:
    try:
        print (i,next(temp))
    except StopIteration as q:
        print (i,None)

本人逻辑,但通用性还是不够(例如改成print或return(如果需要的话),需要改多个地方)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-17 08:26:02 From FishC Mobile | 显示全部楼层
顺便问下,怎么把出现的报错改写成返还其他东西,例如在idle输入1/0,它本应该报错,却把报错变成返还一个None对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-17 09:40:30 | 显示全部楼层
对于第一个 一次性取两个元素 我暂时只想到reduce 但是也要import
如果你不想import,只能折中使用zip
  1. my_iterable = [1,1,2,3,5,8,13]
  2. for x in zip(my_iterable[::2], my_iterable[1::2]):
  3.     print(x)
复制代码


第二个和第一个其实是一种情况
  1. m1 = [1,1,2,3,5,8,13]
  2. m2 = 'qweasdzxc'
  3. for x in zip(m1,m2):
  4.     print(x)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-17 18:57:54 | 显示全部楼层
为什么不使用标准库呢,我感觉能充分使用python的标准库来解决问题是很pythonic的一件事情。
仅仅使用一些全局的BIF来实现的话实现过程差强人意,可读性也低,仿佛在写C的代码,完全不符合python之禅的理念。
  1. my_iterable = [1, 1, 2, 3, 5, 8, 13]
  2. for i in range(max([len(my_iterable[::2]), len(my_iterable[1::2])])):
  3.     print(my_iterable[::2][i:i + 1] + my_iterable[1::2][i:i + 1])

  4. m1 = [1, 1, 2, 3, 5, 8, 13]
  5. m2 = list('qweasdzxc')
  6. for i in range(max([len(m1), len(m2)])):
  7.     print(m1[i:i + 1] + m2[i:i + 1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-17 19:18:40 | 显示全部楼层
第四时空 发表于 2018-8-17 18:57
为什么不使用标准库呢,我感觉能充分使用python的标准库来解决问题是很pythonic的一件事情。
仅 ...

看我在8楼思路,可能我是想用最简单的方法模仿标准库(库有那么多,如果单单都学库的话,那和学软件就没区别了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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