鱼C论坛

 找回密码
 立即注册
查看: 5354|回复: 10

[已解决]关于lambda、map、join操作元组问题

[复制链接]
发表于 2015-10-27 16:07:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ~风介~ 于 2015-10-27 16:10 编辑

先贴一个stackoverflow上的问题
I have a two list of tuple as follows.I want to print this tuples separated by ‘|’.How an I achieve this.
  1. listoftuple =[(1,2),(3,4),(5,6)]
  2. listoftuple1 =[(3,4,5),(5,6,7),(9,0,9)]
复制代码

I want the result to be printed as follows:
  1. 1|2 3|4 5|6
  2. 3|4|5 5|6|7 9|0|9
复制代码

2 Answers:
  1. >>> " ".join(map(lambda x: "|".join(map(str, x)), listoftuple1))
  2. '3|4|5 5|6|7 9|0|9'
复制代码


***********************我的问题***********************
现有元组t1
  1. >>> t1 = ((3,5),(4,5),(5,9))
复制代码

想要变成以下形式:
  1. '35 45 59'
复制代码

以下代码为什么会报错?
  1. ' '.join(map(lambda x:map(str, x), t1))
复制代码

报错信息:
  1. Traceback (most recent call last):
  2.   File "<pyshell#37>", line 1, in <module>
  3.     ' '.join(map(lambda x:map(str, x), t1))
  4. TypeError: sequence item 0: expected str instance, map found
复制代码

然而,为什么以下代码却没有报错?
  1. >>> ' '.join(map(lambda x:'|'.join(map(str, x)), t1))
  2. '3|5 4|5 5|9'
  3. >>>
复制代码
最佳答案
2015-10-27 22:59:55
夕阳游龙 发表于 2015-10-27 21:13
你的改写后的lambda相当于:

运行后就会出现下面的错误

不好意思,四楼我说错了,把你的代码看错了,我是按下面贴的代码思维理解的。
  1. >>> map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)')
  2. <map object at 0x024F0310>
  3. >>> ''.join(map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  4. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  5. >>> ''.join(map(ccc,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  6. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  7. >>> def ddd(x):
  8.         return [str(x)]

  9. >>> ''.join(map(ddd,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  10. Traceback (most recent call last):
  11.   File "<pyshell#109>", line 1, in <module>
  12.     ''.join(map(ddd,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  13. TypeError: sequence item 0: expected str instance, list found
  14. >>> ''.join(map(ddd,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  15. Traceback (most recent call last):
  16.   File "<pyshell#110>", line 1, in <module>
  17.     ''.join(map(ddd,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  18. TypeError: sequence item 0: expected str instance, list found
  19. >>> def ccc(x):
  20.         return str(x)

  21. >>> ''.join(map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  22. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  23. >>> ''.join(map(ccc,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  24. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  25. >>>
复制代码



你参考下,ddd(x)函数和ccc(x)函数,一个返回列表,会出错,一个返回字符串,没有出错。事实上map函数我没有用到像你这么复杂的,我也hold不住这样的。我理解的map函数,就是一个函数参数,一个可迭代的参数(列表,字符串等),最后函数的结果返回成一个列表。

针对你说的为什么会变成:3|4|5 5|6|7 9|0|9 的结果,我说下我的理解,你参考下,不一定正确,所以我开始没写我的理解。
由于t2 = [(3,4,5),(5,6,7),(9,0,9)],可迭代,那么首先运行的是mmm((3,4,5)即变成‘3|4|5',然后mmm((5,6,7)),即变成'5|6|7',最后就是mmm((9,0,9)),即变成'9|0|9',则map(mmm,t2)返回的是
['3|4|5','5|6|7','9|0|9'] 然后就是" ".join(['3|4|5','5|6|7','9|0|9']) 也就是3|4|5 5|6|7 9|0|9   (mmm(x)函数是3楼的mmm函数)

你的' '.join(map(lambda x:map(str, x), t1)),错误提示是期待一个str实例,但结果是map found .
也就是lambda 函数返回的是一个map对象,你并没有对map进行处理,我把你的出错理解成了
' '.join(map(lambda x:list(map(str, x)), t1))这样出的错,显示值一般得list(map(func,t1)) 或者其他的例如
''.join(map(func,t1))  或者tuple(map(lambda x:x,range(3)))等等。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
拈花小仙 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2015-10-27 16:12:01 | 显示全部楼层
坐等高手指教~@小甲鱼 @夕阳游龙 @醉酒青牛 @高手xxx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-27 20:46:47 | 显示全部楼层
~风介~ 发表于 2015-10-27 16:12
坐等高手指教~@小甲鱼 @夕阳游龙 @醉酒青牛 @高手xxx

你这里面的lambda 函数实际上相当于一个包含内嵌函数的函数,也就是我下面用函数写出来的函数mmm(x) ,以及函数uuu(x)
  1. def mmm(x):
  2.     def nnn(x):
  3.         list1 = []
  4.         for each in x:
  5.             list1.append(str(each))
  6.         return list1
  7.     return '|'.join(nnn(x))

  8. t1 =[(3,5),(4,5),(5,9)]
  9. t2 =[(3,4,5),(5,6,7),(9,0,9)]            
  10. print(' '.join(map(mmm,t2)))


  11. def uuu(x):
  12.     def vvv(x):
  13.         list1 = []
  14.         for each in x:
  15.             list1.append(str(each))
  16.         return list1
  17.     return ''.join(vvv(x))
  18. print(' '.join(map(uuu,t1)))
复制代码


map(func,t1,t2,t3)  ,map函数第一个参数为函数,如果func(x,y,z),有三个参数,则,t1,t2,t3代表x,y,z,如果func(x)只有一个参数,那么map(func,t1),后面就两个参数,一个是函数参数。并且t1,t2,t3,都是可迭代的列表,元组,字符串等。但是map,并不是简单将t1,t2,t3,当成x,y,z带入func(x,y,z)中计算,map接收一个函数和一个可迭代对象(如列表)作为参数,用函数处理每个元素,然后返回新的列表。建议查查map函数用法。
'|'.join(['a','b','c'])结果是 'a|b|c' 也就是将'|'最为分隔符,插在后面的对象中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-27 21:13:12 | 显示全部楼层
夕阳游龙 发表于 2015-10-27 20:46
你这里面的lambda 函数实际上相当于一个包含内嵌函数的函数,也就是我下面用函数写出来的函数mmm(x) ,以 ...

你的改写后的lambda相当于:
  1. def mmm(x):
  2.     def nnn(x):
  3.         list1 = []
  4.         for each in x:
  5.             list1.append(str(each))
  6.         return list1
  7.     return nnn(x)
  8. t2 =[(3,4,5),(5,6,7),(9,0,9)]            
  9. print(' '.join(map(mmm,t2)))
复制代码

运行后就会出现下面的错误
  1. >>>
  2. Traceback (most recent call last):
  3.   File "F:\Python3.4\练习\lian10.py", line 6970, in <module>
  4.     print(' '.join(map(mmm,t2)))
  5. TypeError: sequence item 0: expected str instance, list found
复制代码

原因 我也说不好,因为拿不准!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-27 22:59:55 | 显示全部楼层    本楼为最佳答案   
夕阳游龙 发表于 2015-10-27 21:13
你的改写后的lambda相当于:

运行后就会出现下面的错误

不好意思,四楼我说错了,把你的代码看错了,我是按下面贴的代码思维理解的。
  1. >>> map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)')
  2. <map object at 0x024F0310>
  3. >>> ''.join(map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  4. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  5. >>> ''.join(map(ccc,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  6. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  7. >>> def ddd(x):
  8.         return [str(x)]

  9. >>> ''.join(map(ddd,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  10. Traceback (most recent call last):
  11.   File "<pyshell#109>", line 1, in <module>
  12.     ''.join(map(ddd,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  13. TypeError: sequence item 0: expected str instance, list found
  14. >>> ''.join(map(ddd,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  15. Traceback (most recent call last):
  16.   File "<pyshell#110>", line 1, in <module>
  17.     ''.join(map(ddd,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  18. TypeError: sequence item 0: expected str instance, list found
  19. >>> def ccc(x):
  20.         return str(x)

  21. >>> ''.join(map(ccc,'(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'))
  22. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  23. >>> ''.join(map(ccc,['(3, 4, 5)|(5, 6, 7)|(9, 0, 9)']))
  24. '(3, 4, 5)|(5, 6, 7)|(9, 0, 9)'
  25. >>>
复制代码



你参考下,ddd(x)函数和ccc(x)函数,一个返回列表,会出错,一个返回字符串,没有出错。事实上map函数我没有用到像你这么复杂的,我也hold不住这样的。我理解的map函数,就是一个函数参数,一个可迭代的参数(列表,字符串等),最后函数的结果返回成一个列表。

针对你说的为什么会变成:3|4|5 5|6|7 9|0|9 的结果,我说下我的理解,你参考下,不一定正确,所以我开始没写我的理解。
由于t2 = [(3,4,5),(5,6,7),(9,0,9)],可迭代,那么首先运行的是mmm((3,4,5)即变成‘3|4|5',然后mmm((5,6,7)),即变成'5|6|7',最后就是mmm((9,0,9)),即变成'9|0|9',则map(mmm,t2)返回的是
['3|4|5','5|6|7','9|0|9'] 然后就是" ".join(['3|4|5','5|6|7','9|0|9']) 也就是3|4|5 5|6|7 9|0|9   (mmm(x)函数是3楼的mmm函数)

你的' '.join(map(lambda x:map(str, x), t1)),错误提示是期待一个str实例,但结果是map found .
也就是lambda 函数返回的是一个map对象,你并没有对map进行处理,我把你的出错理解成了
' '.join(map(lambda x:list(map(str, x)), t1))这样出的错,显示值一般得list(map(func,t1)) 或者其他的例如
''.join(map(func,t1))  或者tuple(map(lambda x:x,range(3)))等等。

评分

参与人数 1荣誉 +5 鱼币 +10 贡献 +5 收起 理由
~风介~ + 5 + 10 + 5 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2015-10-27 23:35:38 | 显示全部楼层
夕阳游龙 发表于 2015-10-27 22:59
不好意思,四楼我说错了,把你的代码看错了,我是按下面贴的代码思维理解的。

谢谢了, 哥们幸苦了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 00:10:39 | 显示全部楼层
虽然我不知道为什么会报错,但我知道你一定得不到你想要的结果,这个代码没有错,我验证了
  1. t1 = ((3,5),(4,5),(5,9))
  2. ' '.join(map(lambda x: ''.join(map(str, x)), t1))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +5 收起 理由
~风介~ + 3 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2015-11-8 00:53:52 | 显示全部楼层
本帖最后由 触摸纯白 于 2015-11-8 02:27 编辑

折腾了好久,一些想法,不知对不对
首先需要明白,map()函数返回的一个map对象,其包含类似列表的内容,内容不能像列表一样直接获取,但可以像列表一样类似的操作
对于没有出错的代码,其内部map()函数生成的map对象,被强制转换为str型,然后再次被外层map()函数生成map对象,而后再次强制转化为str型
对于出错的代码,其内部map()函数生成的map对象,再次直接被外层map()函数打包成map对象,当str.join()对其操作时,发现其内部元素全是对象,无法操作,于是map found
  1. def project(x):      #定义测试函数
  2.     return x


  3. m = [1,2,3,4,5,6]   

  4. a = map(project,m)   #制作map对象
  5. b = map(project,m)
  6. c = map(project,m)

  7. n = [a,b,c]          #map对象打包

  8. ' '.join(n)
复制代码

上边的代码,和你出错的代码错误一样,可以验证一下

呃呃呃,,,终于可以睡了:sleepy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-8 17:39:19 | 显示全部楼层
本帖最后由 无名似名 于 2015-11-8 18:36 编辑
触摸纯白 发表于 2015-11-8 00:10
虽然我不知道为什么会报错,但我知道你一定得不到你想要的结果,这个代码没有错,我验证了


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

使用道具 举报

发表于 2015-11-8 18:12:06 | 显示全部楼层
看你的错误提示很明显‘ TypeError: sequence item 0: expected str instance, map found’
问题不在map 在join,很明显你给的类型错误,需要的是‘str’类型实例,但是找到的是map

  1. >>> v=((1,2),(3,4),(5,6))
  2. >>> mv=map(lambda x:map(str,x),v)
  3. >>> mv
  4. <map object at 0x00FD9AB0>
  5. >>> " ".join(mv)
  6. Traceback (most recent call last):
  7.   File "<stdin>", line 1, in <module>
  8. TypeError: sequence item 0: expected str instance, map found
  9. >>>
复制代码


可以很明显看出在join前不会报错 而且给join一个map对象就会报错

不要把问题弄复杂了

评分

参与人数 1荣誉 +3 鱼币 +5 收起 理由
~风介~ + 3 + 5 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2015-11-8 20:53:27 | 显示全部楼层
无名似名 发表于 2015-11-8 18:12
看你的错误提示很明显‘ TypeError: sequence item 0: expected str instance, map found’
问题不在map  ...

可能表述有些问题,我也是这意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 09:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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