是否有内置功能可以从Python中的列表中删除重复项,同时保留顺序?我知道我可以使用一个集来删除重复项,但这会破坏原始顺序.我也知道我可以像这样滚动自己:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我想利用内置或更多的Pythonic习语.
我刚刚在代码中发现了一个逻辑错误,导致了各种各样的问题.我无意中做了一个按位AND而不是逻辑AND.
我更改了代码:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
Run Code Online (Sandbox Code Playgroud)
至:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我收到了相当神秘的错误消息:
ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all()
为什么在使用按位操作时没有发出类似的错误 - 我该如何解决这个问题?
我有一个python脚本,可以接收零或三个命令行参数.(它可以在默认行为上运行,也可以需要指定所有三个值.)
什么是理想的语法:
if a and (not b or not c) or b and (not a or not c) or c and (not b or not a):
Run Code Online (Sandbox Code Playgroud)
?
我认为我完全理解这一点,但我只是想确保,因为我总是看到别人说绝对不要测试反对True
,False
或None
.他们建议例程应该引发错误而不是返回False或None.无论如何,我有很多情况我只想知道是否设置了一个标志,所以我的函数返回True或False.如果没有有用的结果,还有其他情况我有一个函数返回None.从我的想法来看,只要我意识到我永远不应该使用,就不会有问题:
if foo == True
if foo == False
if foo == None
Run Code Online (Sandbox Code Playgroud)
而应该使用:
if foo is True
if foo is False
if foo is None
Run Code Online (Sandbox Code Playgroud)
因为True,False和None都是单例,并且总是会在使用"is"而不是"=="时评估我的预期方式.我错了吗?
沿着相同的路线,修改有时返回None的函数会更加pythonic,以便它们引发错误吗?假设我有一个名为"get_attr()"的实例方法,它从某个文件中检索属性.如果它发现我请求的属性不存在则返回None是否合适?让他们提出错误并在以后捕获它会更好吗?
我正在寻找一种简单的方法来检查变量列表中是否只有一个变量具有True值.我已经看过这个逻辑xor帖子,并试图找到一种方法来适应多个变量,只有一个是真的.
例
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Run Code Online (Sandbox Code Playgroud) 有时在我的代码中,我有一个函数可以用两种方式之一进行参数.就像是:
def func(objname=None, objtype=None):
if objname is not None and objtype is not None:
raise ValueError("only 1 of the ways at a time")
if objname is not None:
obj = getObjByName(objname)
elif objtype is not None:
obj = getObjByType(objtype)
else:
raise ValueError("not given any of the ways")
doStuffWithObj(obj)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?如果arg可以采用三种方式之一怎么办?如果类型不同我可以做:
def func(objnameOrType):
if type(objnameOrType) is str:
getObjByName(objnameOrType)
elif type(objnameOrType) is type:
getObjByType(objnameOrType)
else:
raise ValueError("unk arg type: %s" % type(objnameOrType))
Run Code Online (Sandbox Code Playgroud)
但如果他们不是呢?这种选择似乎很愚蠢:
def func(objnameOrType, isName=True):
if isName:
getObjByName(objnameOrType)
else:
getObjByType(objnameOrType)
Run Code Online (Sandbox Code Playgroud)
因此,你必须称之为func(mytype, …
我有一个 Python 类,它需要接受两个互斥参数之一。如果参数不是排他性的(即:如果两者都给出或都不给出),则应引发错误。
class OrgLocation:
__init__(self, location_num=None, location_path=None):
"""location_num & location_path are mutually exclusive"""
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,最好的选择是创建两个单独的类。但是,我正在使用一个外部 API,它要求这两个属性相互排斥。
要求:
<OrgLocation LocationPathName="ROOT/BU/DIV/SL/DEPT/JOB" LocationNum="1234"/>
Run Code Online (Sandbox Code Playgroud)
回复:
<Error Message="Use either LocationNum or LocationPathName but not both." ErrorCode="1186">
Run Code Online (Sandbox Code Playgroud)
类似的问题似乎表明argparse
可用于命令行界面中的互斥参数,但我不确定如何将其应用于类构造函数
如何创建具有互斥参数的 Python 函数?
问题:有没有办法检查颜色条是否已经存在?
我正在制作许多带有循环的情节.问题是每次迭代都会绘制颜色条!
如果我可以确定颜色条是否存在,那么我可以将颜色条功能放在if语句中.
if cb_exists:
# do nothing
else:
plt.colorbar() #draw the colorbar
Run Code Online (Sandbox Code Playgroud)
如果我使用多处理来制作数字,是否可以防止添加多个颜色条?
import numpy as np
import matplotlib.pyplot as plt
import multiprocessing
def plot(number):
a = np.random.random([5,5])*number
plt.pcolormesh(a)
plt.colorbar()
plt.savefig('this_'+str(number))
# I want to make a 50 plots
some_list = range(0,50)
num_proc = 5
p = multiprocessing.Pool(num_proc)
temps = p.map(plot, some_list)
Run Code Online (Sandbox Code Playgroud)
我知道在绘制下一次迭代之前我可以用plt.clf()和plt.cla()清除这个图.但是,我在我的底图图层上有数据我不想重新绘制(这会增加创建绘图所需的时间).所以,如果我可以删除颜色条并添加一个新颜色,我会节省一些时间.
我试图在python中编译一个if语句,它检查两个变量,看它们是否<= .05.现在如果两个变量都是True,我只想让代码传递/继续,但如果只有一个变量为True,那么我希望代码能够做一些事情.例如:
ht1 = 0.04
ht2 = 0.03
if (ht1 <= 0.05) or (ht2 <= 0.05):
# do something
else:
pass
Run Code Online (Sandbox Code Playgroud)
我不认为这个例子会按照我想要的方式工作,因为我对OR的理解是1条件返回True或两个条件都返回True.如果有人可以帮助我指出正确的方向,那么它将非常适合.
我知道Python的保证,有只有一个实例NoneType
,该None
对象,这样就可以安全地使用is None
测试某等于None
.
是否有同等保障bool
True
和False
(即只有一个每个实例)?
如果没有,为什么不呢?
编辑:我特别注意到,(n+0) is (0+n)
给出True
了n个range(-5, 257)
和False
其他.换句话说,零,前256个正整数和前5个负整数似乎是预先缓存的,并且不会再次实例化.我猜这是解释器的选择(在我的例子中是CPython)而不是语言的规范.并且bool
源自int
,所以我仍然不得不怀疑我可以与其他口译员有什么期望.
编辑:澄清,因为这似乎产生了很多混乱,我的意图是不测试值的布尔解释.为此我永远不会使用is True
或is False
.我的目的是能够区分False
其他一切,在一个变量中可以有几种类型的值,包括空字符串,零和None
,以及类似的True
.我本身就是一位经验丰富的程序员,当我看到"如果booleanvar == True"时,他就是那种畏缩的人.
关于复制品的说明:据称这个问题是(本和本)的副本不回答这个问题; 他们只是声明这bool
是一个int
主要在他们的不同的子类,而repr
不是如果True
并且False
保证是唯一的.
另外,请注意,这不是关于名称 True
和False
绑定的问题,而是关于类的实例的问题bool …
我有两个python对象a
和b
.
什么是最好/最有效/最pythonic的方法来检查这些对象中究竟有一个是None
什么?
我需要一个类的两个属性要么都是None
或都是int
. 已经进行了检查,以确保如果它们都设置为 None 以外的值,则它们将是整数。因此,在该方法的末尾,__init__
我调用一个小函数来检查它们的类型是否以任一顺序不同:
def both_none_or_both_something_else(a,b):
if a is None and b is not None:
return False
if b is None and a is not None:
return False
return True
>> both_none_or_both_something_else(5,None) # False
>> both_none_or_both_something_else(None,3) # False
>> both_none_or_both_something_else(5,20) # True
>> both_none_or_both_something_else(None, None) # True
Run Code Online (Sandbox Code Playgroud)
对两个变量的检查可以压缩成一行吗?
python ×13
if-statement ×2
python-3.x ×2
arguments ×1
boolean ×1
coding-style ×1
colorbar ×1
conditional ×1
duplicates ×1
instance ×1
list ×1
matplotlib ×1
numpy ×1
object ×1
unique ×1
xor ×1