我只是想了解一下在理解列表的过程中会发生什么。有些在列表“就地”上工作的方法在应用于列表理解时似乎不起作用:
a = [[1, 2, 3], [4, 5, 6]]
i1 = id(a[0])
for i in a: i.reverse()
>>> [[3, 2, 1], [6, 5, 4] # Works
print i1 == id(a[0]) # True, same memory address
a = [i.reverse() for i in a]
>>> [None, None] # Doesn't work
print i1
一方面我们有
列表理解[x for x in range(10)]
集理解{x for x in range(10)}
Dict理解力{x: x for x in range(10)}
另一方面,我们有
生成器表达式(x for x in range(10))
为什么前三种表达称为“理解”,而最后一种则称为“表达”?它们的表达方式几乎是一样的,我猜它们的工作方式也非常相似。背后有什么微妙的原因吗?只是为了好奇。
参考文献:
我遇到了下面的代码,以便从列表中删除重复的代码:
seen = set(); print [i for i in list if i not in seen and not seen.add(i)]
我无法理解“而不是seen.add(i)”这部分代码究竟在做什么,因为帮助(set.add)给出了以下解释:
add(...)
Add an element to a set.
This has no effect if the element is already present.
期待您的帮助来理解它。
我正在尝试理解和探索条件句是如何在列表理解中编写的: 我想将下面的for循环转换为列表理解,如果没有点,它会在字符串的第一个位置添加一个点: dot = ['.hello', 'world']
for i in range(len(dot)):
if dot[i][0] != ".":
dot[i] = "." + dot[i] 我相信我一定是错误地应用了所描述的here格式 test = ["." + x for x in dot if dot[x][0
我正在努力成为一个优秀的pythonista,并在可能的情况下使用列表理解...
为什么这个不起作用?
[del my_dict[r] for r in to_remove]
目标是从my dict object my_dict This中删除列表to_remove中的条目:
for r in to_remove:
del my_dict[r]
运行得很好,但我正在尝试使用列表理解
我使用的是Python 2.6.6,我想这样做:
result = [ otherMethod.getDict(x).update({'foo': x.bar}) for x in someList ]
也就是说,我有一个返回对象属性字典的方法,我在列表理解中调用它来构建这些字典的列表,并且我想为每个字典添加一个额外的属性。但是上面的语法给我留下了一个NoneType的列表,如下所示:
result = [ otherMethod.getDict(x) + {'foo': x.bar} for x in someList ]
当然,我可以在列表理解之后使
如果列表元素不是数字,我定义了一个函数将列表中的元素更改为0。它使用列表理解工作,但当我使用普通的for循环时,它不起作用。我试图了解for循环中的错误是什么。
见下面的代码:
def zerozero(mylist):
mylist = [0 if type(x) == str else x for x in mylist]
return mylist
def zerozero2(mylist):
for x in mylist:
if type(x) == str:
x = 0
各位朋友:
我想用列表理解来修改列表元素。例如,如果元素为负数,则将其加4。
因此,该列表
a = [1, -2 , 2]
将被转换为
a = [1, 2, 2]
下面的代码可以工作,但我想知道有没有更好的方法?
谢谢。
for i in range(len(a)):
if a[i]<0:
a[i] += 4
我目前正在尝试理解C++中的列表、堆栈和队列。我正在复习我的考试,遇到一个问题,我问"efficiently implement a queue class using a singly linked list, with no header or tail nodes."
我有点被难住了,有人知道怎么做吗?
可能重复:
我们都知道使用生成器而不是实例化列表可以节省时间和内存,特别是如果我们经常使用理解的话。
不过,这里有一个问题,请考虑以下代码:
output = SomeExpensiveCallEgDatabase()
results = [result[0] for result in output]
return sorted(results)
对排序的调用将返回结果的排序列表。将结果声明如下,然后调用排序是更好还是更糟?
results = (result[0] for result in output)
我猜对sorted()的调用将遍历生成器并实例化列表本身,以便在其上运行
给定此方法:
mergeSorted(struct ListNode * a, struct ListNode * b) {
struct ListNode * result = NULL;
if (a == NULL) return b;
if (b == NULL) return a;
if (a->data <= b->data) {
result = a;
result->next = mergeSorted(a->next, b);
}
else {
re
让我们使用一个简单的代码:
y = [1,2,3]
def plusOne(y):
for x in range(len(y)):
y[x] += 1
return y
print plusOne(y), y
a = 2
def plusOne2(a):
a += 1
return a
print plusOne2(a), a
'y‘的值改变了,而'a’的值保持不变。我已经了解到,这是因为一个是可变的,另一个则不是。但是,如何更改代码,使函数不会更改列表?
例如,要执行类似的操作(为了简单起见,在伪代码中):
a =
我正在尝试用Python3.x编写一个使用列表理解的代码。我的代码应该从列表中打印出字母并删除重复项。
print(list(set(([letter_list.append(letter) for word in word_list for letter in word]))))
代码运行时没有回溯错误,但输出为[None]
我有一个具有相同列和不同值的DataFrames列表。我想把DataFrames列表中的一些列放在熊猫的一行中。
到目前为止,我尝试过(dfs有数据帧列表)
dfs.drop([col for col in ['var1', 'var2'] if col in dfs], axis=1, inplace=True)
和
dfs[dfs.drop([col for col in ['var1', 'var2'] if col in dfs], axis=1, inplace=True)]
两人都犯了同样的错误:
Attribute
我试图理解这段代码:
edit_two_set = set()
edit_two_set = set.union(*[edit_two_set.union(edit_one_letter(w, allow_switches)) for w in one])
这里有一组字符串。allow_switches是真的。edit_one_letter接受一个单词并进行一个字符的插入、删除或相应字符的切换。
我明白:
[edit_two_set.union(edit_one_letter(w, allow_switches)) for w in one]
正在执行列表理解,其中对一个单词进行一个字符编辑,
如何将以下代码重新排列为一个简化的列表理解?
for i in xrange(len(list)):
if list[i].startswith('c'):
list[i] = prefix + list[i]
我尝试了以下方法,但似乎不起作用:
[prefix + list[i] for i in xrange(len(list)) if list[i].startswith('c')]
下面的内容让我大吃一惊:
list[i] = prefix + list[i]
假设我想编写一个生成器,它返回列表,例如迭代列表排列。以以下简单的例子为例:
def list_gen():
foo = [1,2,3,4]
for i in range(5, 9):
foo[1] = i
yield foo
bar = list(list_gen())
print(bar)
bar = [l for l in list_gen()]
print(bar)
for l in list_gen():
print(l, end=' ')
产出如下:
[[1, 8, 3, 4], [1, 8, 3, 4]
我有一个列表理解,在其中,我调用一个函数,将两个参数传递给它。在函数中,我有另一个列表理解,它为我提供了一个DataFrames列表。
我必须清理每个DataFrame中的数据,所以我使用一个for循环来遍历列表中的每个DataFrame。在每次迭代中,我都会做我需要做的事情,其中一件事就是重置每个DataFrame的索引。我在函数之外放了一个print语句,以确保我得到了我所需要的所有东西,但是索引没有被重置。为什么它不被重置?
def function(xls, a_list):
# a_list is a list of strings
df_list = [pd.rea
如何在理解列表的同时嵌套多个if?
我有这个函数:
@click.command
@click.option(--a)
@click.option(--b)
def func1(a,b):
for x in list1:
if any([a, b]):
if any(x==a, x==b]):
print ('x')
else:
print ('x')
如您所见,示例函数接受可选参数。因此,如果将a或b传递给func1,则只会打印与a或b匹配的x。如果没有传递任何参数,则将打印list1的所有元