Python 返回不在列表中的元素
我有一个包含3个元素的列表,例如“1”、“2”、“3”,我想写一个函数,返回不是函数参数的元素。例如:Python 返回不在列表中的元素,python,python-3.x,Python,Python 3.x,我有一个包含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语句来获得它,但是有没有更简单的方法呢?下面是一个一般性的回答:
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语句来获得它,但是有没有更简单的方法呢?下面是一个一般性的回答:
def get_chars(*args):
chars = {'1', '2', '3'}
return (chars^set(args)).pop()
尽管您可能需要做一些事情来处理传入3个参数或1个参数的情况。取决于您的用例
另外请注意,您可以将字符集更改为包含更多字符,并且此函数仍然有效
正如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()
如果传入了错误数量的参数,这仍然会遇到相同的问题,您可以使用以下方法进行检查:
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()
您可以使用两个列表,一个迭代和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
您可以使用if
和中的来测试变量是否存在于参数列表中(args
此处):
这将返回crs
中不在args
中的第一个元素,如果所有元素都存在,则返回Null
。我猜这可能是您所要求的:
def elements_from_crs_not_in_args(*args):
crs = ['1','2','3']
return [i for i in crs if i not in args]
然后:
如果您计划返回单个元素(列表的第一个?)而不是列表,则返回[…][0]如果字符集相同,我将首先做两件事,我将把它们拉到函数外部,这样它就不会每次执行。第二种方法是使用集合操作对称差异^
查找仅存在于两个列表中的一个列表中的所有元素,或者使用差异查找一个集合与另一个集合的差异。最后,您必须将集合转换为元组,以获取第一个元素,因为集合不支持索引
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 literal
crs = {'1', '2', '3'}
def get_char(a, b):
return (crs - {a, b}).pop()
print(get_char('1', '2')) #'3'
它总是n
元素,而您提供n-1
元素作为函数的输入吗?set(['1','2','3'])^set(a,b)
是的,它应该总是这样工作。@mad:^
与所需的行为有点偏离,这是Python 3,因此您可以使用set
文本<代码>{'1','2','3'}-{a,b}
更干净、更正确。谢谢!这就是我想做的!你想要的是-
,而不是^
^
将返回chars
中不在args
中的元素和args
中不在chars
中的元素,而chars-set(args)
(或chars.difference(args)
,命名方法不要求将参数显式转换为set
)只返回chars
中的值,而在args
中找不到@ShadowRanger Good call。您不使用set
文本有什么原因吗?它们从/(现在已经八年多了)开始使用,它们比调用列表/元组文本上的集合构造函数更快更清晰。@ShadowRanger是的,我有一个从老年开始运行的2.7的本地环境。