我有一个包含3个元素的列表,例如'1','2','3',我想编写一个函数,该函数返回的元素不是函数参数。例如:
def get_char(a, b):
crs = ['1', '2', '3']
return something
x = get_char('1', '2')
x = '3'
x = get_char('3', '2')
x = '1'
您可以看到我要完成的工作。我知道我可以通过使用if语句来获得它,但是有没有更简单的方法呢?
答案 0 :(得分:1)
以下是一般答复:
def get_chars(*args):
chars = {'1', '2', '3'}
return (chars^set(args)).pop()
尽管您可能需要做一些事情来处理传入3个参数或1个参数的情况。取决于您的用例。
还请注意,您可以将chars
设置更改为包含更多字符,并且此功能仍然有效。
正如ShadowRanger在评论中指出的那样,设置减法可能比按位异或更有意义。像这样:
def get_chars(*args):
return ({'1', '2', '3'} - set(args)).pop()
如果传入错误数量的参数,仍然会遇到相同的问题,您可以使用类似以下的方法进行检查:
def get_chars(*args):
diff = {'1', '2', '3'} - set(args)
if len(diff) != 1:
# Handle the incorrect number of args (or use error)
return None
return diff.pop()
答案 1 :(得分:0)
您可以使用两个列表,一个迭代和not in函数:
x = [1,2,3]
y = [1,5,7]
def compare(original_list, list_to_compare):
for i in original_list:
if i not in list_to_compare:
print(i)
compare(x,y)
# result 2, 3
compare(y,x)
*emphasized text*# result 5,3
答案 2 :(得分:0)
您可以使用if
和in
测试变量是否在参数列表中(此处为args
):
>>> def get_char(*args):
... crs = ['1', '2', '3']
... for x in crs:
... if x not in args:
... return x
... return Null
...
>>> x = get_char('1', '2')
>>>
>>> x
'3'
这将返回crs
中不存在的第一个元素,如果所有元素都存在,则返回args
。
答案 3 :(得分:0)
我想这可能是您要的:
BufferedSource
然后:
def elements_from_crs_not_in_args(*args):
crs = ['1','2','3']
return [i for i in crs if i not in args]
如果您打算返回单个元素(列表的第一个?)而不是列表,请返回[..] [0]
答案 4 :(得分:0)
如果char
的集合相同,我将首先做两件事,我会将它们拉到函数的外面,这样就不会每次都执行。第二次使用集合操作对称差^
来查找仅存在于两个列表中的一个列表中的所有元素,或者使用差来找到一个集合与另一个集合的差。最后,必须将集合转换为元组,以使集合中的第一个元素不支持索引
crs = set(['1', '2', '3'])
def get_char(a, b):
return (crs ^ set((a,b))).pop()
print(get_char('1', '2')) #'3'
或更佳
crs = set(['1', '2', '3'])
def get_char(a, b):
return (crs - set((a,b))).pop()
print(get_char('1', '2')) #'3'
在Python3中,您可以使用@ShadowRanger指出的set字面量
crs = {'1', '2', '3'}
def get_char(a, b):
return (crs - {a, b}).pop()
print(get_char('1', '2')) #'3'