我正在寻找一种漂亮,高效和pythonic的方式来做这样的事情:
('zone1', 'pcomp110007')
对此:
'ZONE 1, PCOMP 110007'
regex如果可能的话,不使用(除非它确实产生了很大的不同......).因此,将每个字母转换为大写字母,在字母和数字之间放置一个空格,并用逗号连接.
我写的是以下内容:
tags = ('zone1', 'pcomp110007')
def sep(astr):
chars = ''.join([x.upper() for x in astr if x.isalpha()])
nums = ''.join([x for x in astr if x.isnumeric()])
return chars + ' ' + nums
print(', '.join(map(sep, tags)))
Run Code Online (Sandbox Code Playgroud)
哪个确实产生了预期的结果,但看起来有点太多了.
元组的长度可能不同,但数字总是在每个字符串的末尾.
Python文档说浮点计算失败时会引发FloatingPointError.但这里的"浮动计算"究竟是什么意思呢?我尝试使用浮点数进行添加,乘法和除法,但从未设法提出此特定错误.相反,我有一个TypeError:
10/'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解什么时候FloatingPointError在python中引发?
我的印象是startswith 必须比必须做更多检查in的简单原因更快(允许在字符串中的任何地方查找单词).但我怀疑,所以我决定.时间的代码如下所示,您可能会注意到我没有做太多时间; 代码很简单.intimeit
import timeit
setup1='''
def in_test(sent, word):
if word in sent:
return True
else:
return False
'''
setup2='''
def startswith_test(sent, word):
if sent.startswith(word):
return True
else:
return False
'''
print(timeit.timeit('in_test("this is a standard sentence", "this")', setup=setup1))
print(timeit.timeit('startswith_test("this is a standard sentence", "this")', setup=setup2))
Run Code Online (Sandbox Code Playgroud)
结果:
>> in: 0.11912814951705597
>> startswith: 0.22812353561129417
Run Code Online (Sandbox Code Playgroud)
所以startswith慢了两倍!我发现这个行为非常令人费解,因为我上面已经说过了.我对两个人的计时做错了还是in确实更快?如果是这样,为什么?
请注意,即使它们都返回,结果也非常相似False(在这种情况下,in如果它之前只是短路,则必须实际遍历整个传感器):
print(timeit.timeit('in_test("another standard sentence, would be that", "this")', …Run Code Online (Sandbox Code Playgroud) 我有一个字典列表list_of_dict,一组键set_of_keys和另一个字典dict_to_compare.
如果三个可能键中任意两个键的值与来自的值匹配,我需要过滤dicts列表dict_to_compare.
输入:
set_of_keys = {'val1', 'val2', 'val3'}
dict_to_compare = {'k1': 'val1', 'k2': 'val2','k3':'val6'}
list_of_dict = [
{'k1': 'val1', 'k2': 'val2', 'k3':'val3'},
{'k1': 'val4', 'k2': 'val5', 'k3':'val6'},
{'k1': 'val7', 'k2': 'val8', 'k3':'val9'}
]
Run Code Online (Sandbox Code Playgroud)
输出:
out = [{'k1': 'val1', 'k2': 'val2', 'k3': 'val3'}] #First element from list
Run Code Online (Sandbox Code Playgroud)
list_of_dicts都具有相同的键.dict_to_compare也有与元素相同的键list_of_dicts.list_of_dicts可以匹配多个元素.我尝试通过明确指定一堆if elif条件来做到这一点.但问题是关键设置确实很大.有没有更好的方法来解决这个问题?
谢谢
我知道浮点数学的本质,但我仍然发现以下令人惊讶的:
from fractions import Fraction
print(Fraction(0.2)) # -> 3602879701896397/18014398509481984
print(Fraction(str(0.2))) # -> 1/5
print(Fraction(0.2)==Fraction(str(0.2))) # returns False
print(0.2 == float(str(0.2))) # but this returns True!
Run Code Online (Sandbox Code Playgroud)
从文档中我找不到任何可以解释的东西.它确实说明:
...此外,Fraction构造函数也接受任何表示有限值且被float构造函数接受的字符串...
但对我来说,这意味着一种类似的行为float(),我只是看不到如上所示.
重要的是要注意,上面显示的行为并不特定于值(0.2),而是一般的; 我试过的一切都表现得一样.
有趣的是:
from fractions import Fraction
for x in range(1, 257):
if Fraction(str(1/x))==Fraction(1/x):
print(x)
Run Code Online (Sandbox Code Playgroud)
仅打印小于所选上限的2的幂:
1
2
4
8
16
32
64
128
256
Run Code Online (Sandbox Code Playgroud) 我想创建一个接受短文本并以所谓的Jaden Case模式返回的函数,其中每个单词的首字母均为大写(我可以找到的最佳参考)。
例如"Hi, I'm twenty years old"应该返回"Hi I'm Twenty Years Old"。
我已经尝试过自己解决此问题,但是撇号后的字母变成大写字母,而实际上不应该。
我的尝试:
def toJadenCase(string):
for letter in string:
if letter == "\'" :
letter[+1].lowercase()
else:
return string.title()
return string
Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本,我必须根据许多条件测试数字.如果满足任何条件,我想返回True,我想以最快的方式做到这一点.
我的第一个想法是使用any()而不是嵌套if语句或多个or链接我的条件.因为我会满意,如果任何条件是True我真的可以从any()懒惰和尽快返回真正受益.
基于以下事实:以下打印立即发生而不是在10(= 0 + 1 + 2 + 3 + 4)秒之后,我认为是.是这样的,还是我错了?
import time
def some(sec):
time.sleep(sec)
return True
print(any(some(x) for x in range(5)))
Run Code Online (Sandbox Code Playgroud) 有没有更好的方法来写下面的习语:
while q.empty(): # wait until data arrives.
time.sleep(5)
while not q.empty(): # start consuming data until there is nothing left.
data = q.get() # this removes an item from the queue (works like `.pop()`)
# do stuff with data
Run Code Online (Sandbox Code Playgroud)
qmultiprocessing.Queue()虽然我认为上面的结构也可以在其他地方找到,但是是一个相关的实例.
我觉得必须有一个更好的方法来做到这一点..
我有一个列表,如下所示
[['H1','L', '1']
['H1','S', '1']
['H2','L', '1']
['H2','L', '1']]
Run Code Online (Sandbox Code Playgroud)
并希望基于column1和column2进行分组.python是否在列表中提供了我可以获得以下结果的任何内容
H1 L 1
H1 S 1
H2 L 2
Run Code Online (Sandbox Code Playgroud) 我想删除主题标签符号 ( '#') 和分隔单词 ( '_') 的下划线
例子: "this tweet is example #key1_key2_key3"
我想要的结果: "this tweet is example key1 key2 key3"
我的代码使用字符串:
#Remove punctuation , # Hashtag Symbol
translate_table = dict((ord(char), None) for char in string.punctuation)
cleaned_combined_tweets.translate(translate_table)
Run Code Online (Sandbox Code Playgroud)
这给出了结果: "this tweet is example key1key2key3"