我正在使用.txt文件.我想要一个文件的字符串,没有非ASCII字符.但是,我想留下空格和句号.目前,我也正在剥离它们.这是代码:
def onlyascii(char):
if ord(char) < 48 or ord(char) > 127: return ''
else: return char
def get_my_string(file_path):
f=open(file_path,'r')
data=f.read()
f.close()
filtered_data=filter(onlyascii, data)
filtered_data = filtered_data.lower()
return filtered_data
Run Code Online (Sandbox Code Playgroud)
我应该如何修改onlyascii()以留出空格和句点?我想这不是太复杂但我无法弄明白.
假设我有一个包含大量项目的列表.
l = [ 1, 4, 6, 30, 2, ... ]
Run Code Online (Sandbox Code Playgroud)
我想从该列表中获取项目数,其中项目应满足特定条件.我的第一个想法是:
count = len([i for i in l if my_condition(l)])
Run Code Online (Sandbox Code Playgroud)
但是如果my_condition()过滤列表也有很多项,我认为为过滤结果创建新列表只是浪费内存.为了效率,恕我直言,以上呼叫不能比:
count = 0
for i in l:
if my_condition(l):
count += 1
Run Code Online (Sandbox Code Playgroud)
有没有任何功能风格的方法来获得满足特定条件的项目#而不生成临时列表?
提前致谢.
在调试我的代码时,我想使用列表理解.但是,当我在函数内部时,似乎无法从调试器中评估列表理解.
我使用的是Python 3.4.
脚本内容:
$ cat test.py
#!/usr/bin/python
def foo():
x = [1, 2, 3, 3, 4]
print(x)
foo()
Run Code Online (Sandbox Code Playgroud)
交互式调试:
$ python3 -mpdb test.py
> /tmp/test.py(3)<module>()
-> def foo():
(Pdb) step
> /tmp/test.py(8)<module>()
-> foo()
(Pdb)
--Call--
> /tmp/test.py(3)foo()
-> def foo():
(Pdb)
> /tmp/test.py(4)foo()
-> x = [1, 2, 3, 3, 4]
(Pdb)
> /tmp/test.py(6)foo()
-> print(x)
(Pdb) p [x for _ in range(1)]
*** NameError: name 'x' is not defined
(Pdb) p x
[1, 2, 3, 3, …Run Code Online (Sandbox Code Playgroud) 我不确定我是否需要lambda或其他东西.但是,我仍然需要以下内容:
我有一个array = [1,2,3,4,5].我需要把这个数组放到另一个数组中.但是把它全部写在一行.
for item in array:
array2.append(item)
Run Code Online (Sandbox Code Playgroud)
我知道这完全可以遍历项目并使其成为一行.但谷歌搜索和阅读手册并没有帮助我...如果你能给我一个提示或命名这个东西,以便我能找到那是什么,我真的很感激.
更新:让我们这样说:array2 = SOME FANCY EXPRESSION THAT IS GOING TO GET ALL THE DATA FROM THE FIRST ONE
(这个例子不是真的.我只是想迭代不同的数据块,但这是我能想到的最好的)
我需要生成一个非常大的文本文件.每一行都有一个简单的格式:
Seq_num<SPACE>num_val
12343234 759
Run Code Online (Sandbox Code Playgroud)
我们假设我将生成一个包含1亿行的文件.我尝试了两种方法,令人惊讶的是它们提供了非常不同的时间性能.
对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后我将其写入文件.这种方法需要花费很多时间.
## APPROACH 1
for seq_id in seq_ids:
num_val=rand()
line=seq_id+' '+num_val
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后将其附加到列表中.当循环结束时,我迭代列表项并将每个项写入文件.这种方法花费的时间少得多.
## APPROACH 2
data_lines=list()
for seq_id in seq_ids:
num_val=rand()
l=seq_id+' '+num_val
data_lines.append(l)
for line in data_lines:
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)注意:
所以方法1必须花费更少的时间.什么提示我缺少什么?
我有两个python列表:
a = [('when', 3), ('why', 4), ('throw', 9), ('send', 15), ('you', 1)]
b = ['the', 'when', 'send', 'we', 'us']
Run Code Online (Sandbox Code Playgroud)
我需要过滤掉与b中类似的所有元素.就像在这种情况下,我应该得到:
c = [('why', 4), ('throw', 9), ('you', 1)]
Run Code Online (Sandbox Code Playgroud)
什么应该是最有效的方法?
filter用否定来写一个最惯用的方法是什么?
例:
is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )
Run Code Online (Sandbox Code Playgroud)
当然,你可以使用列表推导 - 但是你filter无论如何都不需要使用
如果有人想知道,我在尝试根据条件分割列表时偶然发现了这一点
我有一个数组(移动)。我想迭代我的移动数组并为每个元素设置一个条件。条件是,如果元素中的任何一个数字为负数,那么我想从 moves 数组中删除该元素。循环无法正确删除我的项目。但是如果我通过完全相同的循环运行它两次,那么它将删除最后一个元素。这对我来说毫无意义。使用Python 3.6
moves = [[3,-1],[4,-1],[5,-1]]
for move in moves:
if move[0] < 0 or move[1] < 0:
moves.remove(move)
Run Code Online (Sandbox Code Playgroud)
如果运行此代码,移动将以 [[4,-1]] 的结果结束,但是如果您再次通过完全相同的 for 循环运行此结果,则结果为 []
我还尝试使用更多元素来执行此操作,但由于某种原因,它只是没有抓住某些元素。这是 .remove() 的错误吗?这就是我尝试过的...(在此我尝试检测非负数以查看这是否是问题的一部分,但事实并非如此)
moves = [[3,1],[4,1],[5,1],[3,1],[4,1],[5,1],[3,1],[4,1],[5,1]]
for move in moves:
if move[0] < 2 or move [1] < 2:
moves.remove(move)
Run Code Online (Sandbox Code Playgroud)
上面代码的结果是
moves = [[4, 1], [3, 1], [4, 1], [5, 1]]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗???
python ×10
filter ×2
list ×2
python-3.x ×2
algorithm ×1
ascii ×1
count ×1
datetime ×1
debugging ×1
lambda ×1
large-data ×1
large-files ×1
negation ×1
numpy ×1
performance ×1
sequence ×1
text ×1
time ×1
unicode ×1