我有这段代码:
numbers = range(1, 50)
for i in numbers:
if i < 20:
numbers.remove(i)
print(numbers)
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是:
[2,4,6,8,10,12,14,16,18,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 ,36,37,38,39,40,41,42,43,44,45,46,47,48,49]
当然我希望结果中没有出现20以下的数字,我假设我在删除时做错了.
在Python中循环遍历列表时,我无法在没有列表推导的情况下修改元素.以供参考:
li = ["spam", "eggs"]
for i in li:
i = "foo"
li
["spam", "eggs"]
li = ["foo" for i in li]
li
["foo", "foo"]
Run Code Online (Sandbox Code Playgroud)
那么,为什么我不能通过Python中的循环修改元素呢?肯定有一些我想念的东西,但我不知道是什么.我敢肯定,这是一个重复的,但我无法找到一个关于这个问题,如果有一个链接,这将是绰绰有余.先感谢您!
从迭代中删除项目通常会导致RuntimeError: dictionary changed size during iteration异常:
d = {1: 2}
# exception raised
for k in d:
del d[k]
Run Code Online (Sandbox Code Playgroud)
更确切地说,删除本身将成功.但是,要进入下一轮迭代,解释器必须调用next(it),it通过之前获得的字典,迭代器在哪里.此时,next()会注意到字典大小发生了变化,并抱怨.
到现在为止还挺好.但是如果我们都删除并添加项目到字典呢?
d = {1: 1}
# no exception raised
for k in d:
# order of next two lines doesn't matter
d[k*10] = k*10
del d[k]
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定这不安全(文档暗示在迭代期间不允许插入或删除).为什么解释器允许此代码无错运行?
我唯一的猜测是,每当调用insert或delete方法时,检查哪些迭代器无效是太昂贵了.所以dict不要尝试完善提出这个例外.相反,它只是跟踪每个迭代器内部字典的大小,并在实际要求迭代器移动到下一个项目时检查它是否未更改.有没有办法能够以低成本实现全面验证?
我是Python新手并尝试使用Python 3.2.3(默认,2012年10月19日,20:13:42),linux2上的[GCC 4.6.3]
这是我的样本代码
>>> l=[1,2,3,4,5,6]
>>> for i in l:
... l.pop(0)
... print(l)
...
Run Code Online (Sandbox Code Playgroud)
我期待以下输出
1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
4
[5, 6]
5
[6]
6
[]
Run Code Online (Sandbox Code Playgroud)
相反,我得到了这个
1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
for循环在3转后停止迭代.有人可以解释一下原因吗?
我想了解为什么会发生以下情况.我的猜测是在列表迭代期间正在创建临时,但是需要一些专家来确认:
def test():
a=[set([1,2,3]),set([3,4,5])]
x=set([1,4])
for i in a:
# doesn't actually modify list contents, making a copy of list elements in i?
i=i.difference(x)
print a
for idx,i in enumerate(a):
i=i.difference(x)
print id(i),id(a[idx])
# obviously this modifies the contents
a[idx]=i
print a
Run Code Online (Sandbox Code Playgroud)
输出:
[set([1, 2, 3]), set([3, 4, 5])]
59672976 59672616
59672616 59672736
[set([2, 3]), set([3, 5])]
Run Code Online (Sandbox Code Playgroud)
另外,我想理解为什么第二次迭代中i的"id"与[0]的"id"相同.
我正在使用Python来解析列表中的一些字符串.有些字符串可能只包含我想忽略的非字母数字字符,如下所示:
list = ['()', 'desk', 'apple', ':desk', '(house', ')', '(:', ')(', '(', ':(', '))']
for item in list:
if re.search(r'\W+', item):
list.remove(item)
# Ideal output
list = ['desk', 'apple', ':desk', '(house']
# Actual output
list = ['desk', 'apple', '(:', '(', '))']
Run Code Online (Sandbox Code Playgroud)
这是我对这个问题的正则表达式的第一次尝试,但它并没有真正达到预期的效果.如何编写正则表达式来忽略任何带有非字母数字字符的字符串?
我有一个大约62,000个数字的列表A,另一个大约370,000个列表B。我想过滤B,使其只包含来自A的元素。我尝试过这样的事情:
A=[0,3,5,73,88,43,2,1]
B=[0,5,10,42,43,56,83,88,892,1089,3165]
C=[item for item in A if item in set(B)]
Run Code Online (Sandbox Code Playgroud)
哪个可行,但是对于这么大的列表显然很慢,因为(我认为吗?)搜索会遍历整个B,即使已经在B中找到了该元素也是如此。因此脚本正在遍历370,000个元素的列表62,000次。
A和B中的元素是唯一的(B包含0到700,000之间的唯一值的列表,而A包含这些值的唯一子集),因此一旦在B中找到A [i],搜索就可以停止。值也按升序排列(如果有任何意义)。
有什么办法可以更快地做到这一点?
我想迭代一个列表,并删除多次计数的项目,因此它们不会被for循环重复打印.
但是,列表中只出现一次的某些项目似乎也受此影响,我无法弄清楚原因.
任何投入将不胜感激.
示例输出:
listy = [2,2,1,3,4,2,1,2,3,4,5]
for i in listy:
if listy.count(i)>1:
print i, listy.count(i)
while i in listy: listy.remove(i)
else:
print i, listy.count(i)
Run Code Online (Sandbox Code Playgroud)
输出:
2 4
3 2
1 2
Run Code Online (Sandbox Code Playgroud)
因此完全忽略了4和5.
我有一个元组列表(num,id):
l = [(1000, 1), (2000, 2), (5000, 3)]
Run Code Online (Sandbox Code Playgroud)
每个元组的第二个元素包含标识符.假设我要删除带有id的元组,2我该怎么做?
即我想要新列表: l = [(1000,1), (5000, 3)]
我试过l.remove(2)但它不起作用.
python ×10
list ×7
loops ×4
dictionary ×1
filter ×1
for-loop ×1
iteration ×1
iterator ×1
python-3.x ×1
regex ×1