我正在迭代Python中的元组列表,并且如果它们符合某些条件,我会尝试删除它们.
for tup in somelist:
if determine(tup):
code_to_remove_tup
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替code_to_remove_tup?我无法弄清楚如何以这种方式删除项目.
什么时候应该使用生成器表达式?什么时候应该在Python中使用列表推导?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
Run Code Online (Sandbox Code Playgroud) 在迭代它时从Python中删除字典中的项是否合法?
例如:
for k, v in mydict.iteritems():
if k == val:
del mydict[k]
Run Code Online (Sandbox Code Playgroud)
我们的想法是从字典中删除不符合某个条件的元素,而不是创建一个新字典,该字典是被迭代的字典的子集.
这是一个好的解决方案吗?有更优雅/有效的方式吗?
我有一个包含20000个列表的列表.我使用每个列表的第3个元素作为标志.我希望在此列表上执行一些操作,只要至少有一个元素的标志为0,它就像:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
Run Code Online (Sandbox Code Playgroud)
在开始时,所有标志都是0.我使用while循环来检查至少一个元素的标志是否为0:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
Run Code Online (Sandbox Code Playgroud)
如果check(my_list)返回True,那么我继续处理我的列表:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
Run Code Online (Sandbox Code Playgroud)
实际上,当我迭代它时,我想删除my_list中的一个元素,但是当我迭代它时,我不允许删除项目.
原始的my_list没有标志:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Run Code Online (Sandbox Code Playgroud)
因为我迭代它时无法删除元素,所以我发明了这些标志.但是它my_list包含很多项,并且while循环在每个for循环中读取所有项,并且它会消耗大量时间!你有什么建议吗?
想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新GUI,打印到文件等).
def fun_with_side_effects(x):
...side effects...
return y
Run Code Online (Sandbox Code Playgroud)
现在,是Pythonic使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Run Code Online (Sandbox Code Playgroud)
请注意,我不会将列表保存在任何位置
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
在这段代码中,我试图创建一个函数anti_vowel,它将从字符串中删除所有元音(aeiouAEIOU).我认为它应该可以正常工作,但是当我运行它时,示例文本"嘿看单词!" 以"Hy lk Words!"返回.它"忘记"删除最后一个'o'.怎么会这样?
text = "Hey look Words!"
def anti_vowel(text):
textlist = list(text)
for char in textlist:
if char.lower() in 'aeiou':
textlist.remove(char)
return "".join(textlist)
print anti_vowel(text)
Run Code Online (Sandbox Code Playgroud) 假设我有一个x未知长度的列表,我想从中随机弹出一个元素,以便列表之后不包含该元素.什么是最pythonic的方式来做到这一点?
我可以用一个相当不方便combincation做到这一点pop,random.randint以及len和希望看到更短的或更好的解决方案:
import random
x = [1,2,3,4,5,6]
x.pop(random.randint(0,len(x)-1))
Run Code Online (Sandbox Code Playgroud)
编辑:我想要实现的是从列表中连续弹出随机元素.(即,随机弹出一个元素并将其移动到字典中,随机弹出另一个元素并将其移动到另一个字典,...)
请注意,我使用的是Python 2.6,并且没有通过搜索功能找到任何解决方案.
可能重复:
在Python中迭代时从列表中删除项目
我正在尝试从python中的列表中删除一个项目:
x = ["ok", "jj", "uy", "poooo", "fren"]
for item in x:
if len(item) != 2:
print "length of %s is: %s" %(item, len(item))
x.remove(item)
Run Code Online (Sandbox Code Playgroud)
但它不会删除"fren"项目.有任何想法吗?
l = range(100)
for i in l:
print i,
print l.pop(0),
print l.pop(0)
Run Code Online (Sandbox Code Playgroud)
上面的python代码给出了与预期完全不同的输出.我想循环遍历项目,以便我可以在循环时跳过项目.
请解释.
我知道在迭代列表时不允许删除元素,但允许在迭代时将元素添加到python列表中.这是一个例子:
for a in myarr:
if somecond(a):
myarr.append(newObj())
Run Code Online (Sandbox Code Playgroud)
我在我的代码中尝试了这个并且似乎工作正常,但是我不知道是不是因为我很幸运并且它将来会在某个时候破坏?
编辑:我不喜欢复制列表,因为"myarr"很大,因此它太慢了.另外,我需要用"somecond()"检查附加的对象.
编辑:在某些时候"somecond(a)"将是假的,因此不会有无限循环.
编辑:有人问过"somecond()"函数.myarr中的每个对象都有一个大小,每次"somecond(a)"为真,并且一个新对象被附加到列表中,新对象的大小将小于a."somecond()"有一个关于小物体如何的epsilon,如果它们太小,它将返回"false"