相关疑难解决方法(0)

如何检查列表是否为空?

例如,如果传递以下内容:

a = []
Run Code Online (Sandbox Code Playgroud)

如何检查是否a为空?

python list

3235
推荐指数
27
解决办法
254万
查看次数

从列表中删除项目时出现奇怪的结果

我有这段代码:

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 loops list

32
推荐指数
3
解决办法
5844
查看次数

无法修改循环Python中的列表元素

在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中的循环修改元素呢?肯定有一些我想念的东西,但我不知道是什么.我敢肯定,这是一个重复的,但我无法找到一个关于这个问题,如果有一个链接,这将是绰绰有余.先感谢您!

python loops list

29
推荐指数
2
解决办法
3万
查看次数

为什么在迭代期间修改dict并不总是引发异常?

从迭代中删除项目通常会导致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 dictionary python-3.x python-internals

12
推荐指数
2
解决办法
539
查看次数

为什么带有pop-method(或del语句)的for循环不会遍历所有列表元素

我是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转后停止迭代.有人可以解释一下原因吗?

python loops for-loop list

8
推荐指数
2
解决办法
6307
查看次数

在python列表迭代期间临时创建?

我想了解为什么会发生以下情况.我的猜测是在列表迭代期间正在创建临时,但是需要一些专家来确认:

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 iteration list

5
推荐指数
1
解决办法
1455
查看次数

正则表达式匹配非字母数字字符

我正在使用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)

这是我对这个问题的正则表达式的第一次尝试,但它并没有真正达到预期的效果.如何编写正则表达式来忽略任何带有非字母数字字符的字符串?

python regex

3
推荐指数
1
解决办法
4632
查看次数

如何基于python中另一个列表中的元素过滤列表

我有一个大约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],搜索就可以停止。值也按升序排列(如果有任何意义)。

有什么办法可以更快地做到这一点?

python list filter

3
推荐指数
1
解决办法
59
查看次数

迭代列表并删除重复元素时循环问题

我想迭代一个列表,并删除多次计数的项目,因此它们不会被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.

python iterator loops list

2
推荐指数
1
解决办法
2536
查看次数

如果元组包含某个元素,则从列表中删除元组

我有一个元组列表(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

1
推荐指数
1
解决办法
1403
查看次数