请教 PY 的两个循环结束添加元素到集合,结果为什么不一样?

2015-01-24 22:57:46 +08:00
 scylla
代码要实现的功能是把文本文件里的IP地址匹配出来,并把IP添加到集合里。

代码1:

<script src=".py">

re_ip = re.compile('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}')
ip_list = []
with open(path, 'r') as f:
for line in f:
ips = re_ip.findall(line)
ip_list.append(str(x) for x in ips)

</script>

代码1里,集合的结果是这种对象 <generator object <genexpr> at 0x10417ffa0> .... 其实我想要的是IP地址。


代码2:

<script src=".py">

re_ip = re.compile('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}')
ip_list = []
with open(path, 'r') as f:
for line in f:
ips = re_ip.findall(line)
for x in ips:
ip_list.append(x)

</script>

代码2的集合里,结果才是IP地址。

为什么会这样?请不吝赐教,谢谢。
2688 次点击
所在节点    Python
6 条回复
SakuraSa
2015-01-24 23:01:21 +08:00
因为 ip_list.append(str(x) for x in ips) 中的 (str(x) for x in ips) 就是一个 generator 呀
我觉得你可能是想这样 ip_list.extend(str(x) for x in ips)
SakuraSa
2015-01-24 23:02:54 +08:00
另外 findall 的结果就是一个字符串的数组
可以直接 ip_list.append(re_ip.findall(line))
SakuraSa
2015-01-24 23:03:19 +08:00
错了,是 ip_list.extend(re_ip.findall(line))
huangyanan
2015-01-24 23:05:02 +08:00
extend for the first sample
scylla
2015-01-24 23:08:59 +08:00
@SakuraSa

谢谢。 (str(x) for x in ips) 会被解释成一个 generator?怪不得。 ip_list.extend(re_ip.findall(line)) 是可用的。

话说怎么粘代码高亮?用markdown 的’‘’python 和<script src=".py"> 标签都不行。
ryd994
2015-01-26 01:45:40 +08:00
写程序时不看文档么?出了问题还不看?
既然看见存了genenrator,那就看看哪个list方法会取出所有元素而不是直接存入集合啊!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/165154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX