我正在浏览 Python 3.X 的文档,我对列表理解的执行速度及其具体工作原理有疑问。
让我们看下面的例子:
清单 1
...
L = range(0,10)
L = [x ** 2 for x in L]
...
Run Code Online (Sandbox Code Playgroud)
现在据我所知,这会返回一个新列表,相当于写下:
清单 2
...
res = []
for x in L:
res.append(x ** 2)
...
Run Code Online (Sandbox Code Playgroud)
如果我是正确的话,主要区别在于执行速度。清单 1 应该在解释器内以 C 语言速度执行,而清单 2 则不然。
但清单 2 是列表理解在内部执行的操作(不确定),那么为什么清单 1 在解释器内以 C 速度执行,而清单 2 则不是?两者在处理之前都转换为字节码,还是我遗漏了一些东西?
你能看一下下面的代码:
def search(self, filter):
return [note for note in self.notes if note.match(filter)]
Run Code Online (Sandbox Code Playgroud)
我想for,if声明需要冒号.以上,没有冒号后for和if.这种if和for用法看起来不像我在教科书中看到的那样.我通常读到的是这样的:
for note in self.notes:
some code
Run Code Online (Sandbox Code Playgroud)
要么
if note.match(filter):
some code
Run Code Online (Sandbox Code Playgroud)
请您解释一下这种if和for使用,它不包括冒号,这是一个单行的语句.Anf if子句在声明的最后.真的很困惑.
我有一个函数调用game()它打印出一个数字。
我需要使用这个运行 500 次
for i in range(500):
game()
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将这个 500 个数字的输出转换为一个列表。
我在Python中有以下代码,我不确定这里的for循环是如何工作的.
cur.execute("SELECT CUST_ID, COMPANY, LASTNAME, CITY, STATE FROM
mytable")
colnames = [desc[0] for desc in cur.description]
Run Code Online (Sandbox Code Playgroud)
这是如何工作的?
[desc[0] for desc in cur.description]
Run Code Online (Sandbox Code Playgroud)
什么是desc[0]?
我是 python 新手,我试图检查字符串的任何排列是否是回文。这是我的代码:
def isPal(s):
a = set()
for i in s:
if i in a:
a.remove(i)
else:
if (i != '\n') or (i != ' '):
a.add(i)
if len(a) <= 1:
print(s + ' is a palindrome permutation\n')
else:
print(s + ' is not a palindrome permutation\n')
print(a)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不希望我的集合包含空格或字符串中的任何标点符号。有没有办法只检查字母?例如,字符串“Mr. owl ate my Metal worm”在检查是否为回文时不应使用句点或空格。
我有一个包含一些元组的列表以及如下的普通字符串:
a = ['sore', ('PHENOMENA', 'sore'), 'throat', ('ANATOMY', 'throat'), 'and', 'leg', ('ANATOMY', 'leg')]
Run Code Online (Sandbox Code Playgroud)
我想用空格分隔的文本文件写它,格式如下:
sore ('PHENOMENA', 'sore') throat ('ANATOMY', 'throat') and leg ('ANATOMY', 'leg')
Run Code Online (Sandbox Code Playgroud) 我有一个字符串列表,并希望获得一个包含在每个元素上的新列表多次.
lst = ['abc', '123']
n = 3
Run Code Online (Sandbox Code Playgroud)
我可以用for循环来做到这一点:
res = []
for i in lst:
res = res + [i]*n
print( res )
['abc', 'abc', 'abc', '123', '123', '123']
Run Code Online (Sandbox Code Playgroud)
如何使用列表理解?
到目前为止我最好的尝试:
[ [i]*n for i in ['abc', '123'] ]
[['abc', 'abc', 'abc'], ['123', '123', '123']]
Run Code Online (Sandbox Code Playgroud) 非常新的Python学习者 - 请温柔.我在使用Python中的列表推导概念时遇到了一些问题,所以我试图用for循环来区分列表推导代码.
我遇到了一个问题,其中我有两个列表:一个是值列表,第二个是索引列表.工作是使用索引列表从值列表中提取这些列以创建更短的列表.例如,如果列表是:
my_table = ['1', '2', '3', '4']
['5', '6', '7', '8']
['-2', '-3', '-4', '-5']
col_indices = [0, 2]
Run Code Online (Sandbox Code Playgroud)
我们想要:
Output = ['1', '3']
['5', '7']
['-2', '-4']
Run Code Online (Sandbox Code Playgroud)
所以我之前在Stack Overflow上看过这篇文章,我知道用一个列表理解来做到这一点的方法如下:
answer = []
for row in my_table:
reduced_row = [row[idx] for idx in col_indices]
answer.append(reduced_row)
return answer
Run Code Online (Sandbox Code Playgroud)
说实话,我有点得到这个但不完全.为了更好地理解我尝试编写一些嵌套循环来获得相同的结果,但意识到我没有一个很好的方法用我目前的理解水平来做到这一点.
最初我尝试了以下内容:
col_list = []
for row in my_table:
for idx in col_indices:
new = [row[idx]]
col_list.append(new)
return col_list
Run Code Online (Sandbox Code Playgroud)
但我知道这是错误的,因为它只是将第一列的价值追加到第一列.简而言之,我知道列表理解是从这样的索引中提取列的更有效的方法,但是这个代码是为我提供的,我不确定我是否可以用我当前的理解水平自己编写它.为了更好地解析列表理解的想法,我试图找出一种方法,只能使用循环,但我还没有想出办法.有人可以帮我解决这个问题,希望我能更好地处理这段代码的工作原理吗?
我已经看到一些python代码片段,其中循环编写如下:
someList = g.db.execute('SELECT title, body FROM posts')
posts = [dict(title=x[0],body=[1]) for x in someList.fetchAll()]
Run Code Online (Sandbox Code Playgroud)
这种循环是什么意思?
我意识到它可能仅仅被称为for循环,但它的语法与基于c的语言(更短且更高效)完全不同,所以我只是想知道是否有其他名称写得像这样.
我试图排序以下混合的int和字符串列表,但改为获取TypeError.我想要的输出顺序是排序整数然后排序字符串.
x=[4,6,9,'ashley','drooks','chay','poo','may']
>>> x.sort()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
x.sort()
TypeError: '<' not supported between instances of 'str' and 'int'
Run Code Online (Sandbox Code Playgroud) 如果我有一个类似的列表:
my_list = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
和像这样的字典:
my_dict = {'bob':1, 'jane':2, 'fred':17}
Run Code Online (Sandbox Code Playgroud)
我想使用列表查找字典键值,我可以这样做:
In [69]: for i in my_list:
...: for k,v in my_dict.items():
...: if i == v:
...: print(k,v)
Run Code Online (Sandbox Code Playgroud)
返回:
bob 1
jane 2
Run Code Online (Sandbox Code Playgroud)
但我正在尝试更多地使用列表和字典理解,并且正在努力弄清楚如何通过理解来做到这一点......请问有什么帮助吗?