博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018年1月24日腊八纪事
阅读量:5364 次
发布时间:2019-06-15

本文共 1953 字,大约阅读时间需要 6 分钟。

  今天正在看书,老铁给我发来一道面试题。

  初看这道题,我觉得是送分题。嘴角上扬写出一行命令:

print(list((i for i in a if '7net' not in i)))

  仔细看了一眼,这道题说的是将字符删掉,好险中了他的招,然后改了一下。

an=(''.join(i.split('7net')) for i in a)print(list(an))

  看了一下,没毛病,遂发给老铁,老铁瞬即回复:非也,非也。这种难度岂敢请教愚兄。此题有陷阱,若是生成列表推导或是生成器表达式抑或是map,filter,三元表达式,都改变了原来的列表生成了新的列表,其实已经不对了。

  我去,没想到一个小小的面试题还暗藏玄机,我试了一下map函数,结果如下:

print(id(a[2]))xx=map(lambda x:x if '7net' not in x else ''.join(x.split('7net')) ,a)print(iter(xx))print(iter(xx))print(id(iter(xx)))

  可以看出列表的第三个参数的id地址已经变化了,这个值并未包含‘7net’,所以此时列表其实已经不是最初的列表了(就是新列表了)。

  看到这里,我想只能使用列表的删除方法才能完成原地修改了。

nn= (a.remove(i[1]) for i in list(enumerate(a)) if '7net' in i[1])print(list(a))

  生成器表达式中的remove并未生效,并没有改变原来的列表。

  但是放到列表推导中却是可以的。

print(id(a))nn= [a.remove(i[1]) for i in list(enumerate(a)) if '7net' in i[1]]print(list(a))print(id(a))

print(id(a))nn=[a.remove(i) for i in a if '7net' in i]print(a)print(id(a))

  列表与生成器不同,在for循环中修改会导致索引前移,漏删元素。

  但是这并不是我们需要的结果,我们需要的是在原来的基础上修改字符串而不是移除。

  ''.join(i.split('7net'),字符串是不可以原地修改的。所以这样必定会改变列表。

  写到这,我基本上已经断定了,是不能写出这道题的了。因为python中的列表实际上是一个元素内存地址的存储序列,列表只是存储了一个类似指针的地址空间指向内部元素的实际存储地址。而,我们生成新的字符串就是让这些内存地址指向新的值,而新的值需要开辟新的内存空间来存储,那么只要换了新的字符串,那么现在的列表就一定不是原先的列表了。

  too young,simple,上面都是我瞎扯的。

  晚饭的时候,大佬贴来一段代码。仔细看了一下,将a浅拷贝,这时a还是之前的所有内存地址的序列,将原来的地址一一指向新的数据,那么列表已经原地修改。

  这次看起来应该没什么问题了。

print(id(a))a[:]=map(lambda x:x if '7net' not in x else ''.join(x.split('7net')) ,a)print(id(a))print(a)

print('0',id(a[0]))print('1',id(a[1]))print('2',id(a[2]))print(id(a))print('--------------------------')a[:]=map(lambda x:x if '7net' not in x else ''.join(x.split('7net')) ,a)print('0',id(a[0]))print('1',id(a[1]))print('2',id(a[2]))print(id(a))print(a)

  虽然存储字符串的地址发生了改变,但是存储列表的地址还是原地址,所以实现了原地修改。

  所以正解是这样的:

a[:]=[i.replace('7net','') if '7net' in i else i for i in a]

  是这样的:

a[:]=map(lambda x:x if '7net' not in x else ''.join(x.split('7net')) ,a)

  还是总结一下,没有简单的问题,如果你觉得简单的话,那你真是太简单了。

  欢迎指正我的错误。

转载于:https://www.cnblogs.com/Jeffding/p/8343594.html

你可能感兴趣的文章
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>
js函数中this的指向
查看>>
c++ 引用方式传递数组
查看>>
HBase学习之路 (九)HBase phoenix的使用
查看>>
LeetCode() Remove Duplicates from Sorted Array II
查看>>
【svn】idea svn 文件上会出现一个破书
查看>>
cocos2d-x 3.0 场景切换特效汇总(转)
查看>>
The SortedMap Interface
查看>>
SniperOJ-leak-x86-64
查看>>
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>
学好python
查看>>
css-IE中的border-radius和box-shadow
查看>>
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>