Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回不在列表中的元素_Python_Python 3.x - Fatal编程技术网

Python 返回不在列表中的元素

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语句来获得它,但是有没有更简单的方法呢?下面是一个一般性的回答:

我有一个包含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_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的本地环境。