如何在python中只返回列表中的一个不同元素

时间:2018-04-03 19:31:25

标签: python

我有一个元素列表,只有一个(奇数或偶数)与其他元素不同,我想在列表中找到它的索引。

例如:

nums = [2, 4, 6, 8, 7] or nums = [1, 3, 4, 5]
#how using only "for" loop not def (it is too difficult for me yet) do it?
for i,num in enumerate (nums):
    if num % 2 == 1 and ... # I was thinking here of using a count function (I do not know how to tell python that in the same time it should be unique element
        print (i)
    elif if num % 2 == 0 and ...
        print (i)

请解释一下因为我是Python的初学者。

3 个答案:

答案 0 :(得分:2)

很难理解问题的范围,但如果你只是想要多数投票(就像在所有数字中投票支持该组甚至是奇数一样,那么你可能会这样做:

nums1 = [2,4,6,7,8]
nums2 = [2,1,3,5,7]
def get_one(nums):
    nums_bin = [i%2 for i in nums]
    if sum(nums_bin)>1:
        return nums_bin.index(0)
    return nums_bin.index(1)
print nums1, get_one(nums1)
print nums2, get_one(nums2)

# outputs 
# [2, 4, 6, 7, 8] 3
# [2, 1, 3, 5, 7] 0

答案 1 :(得分:0)

nums = [2, 4, 6, 8, 7]

#With the following line you take modulo 2 for each element so nums will become [0, 0, 0, 0, 1]
nums = [x%2 for x in nums]

#you still need to figure out, if the majority of elements was even or odd
#you can do that by checking the sum of the array. If it is 1, all but one element were even, if it is len(nums)-1 all but one were odd.
sum_of_nums = sum(nums)


for i in range(len(nums)):
    #If the sum is ==1 you are looking for the one element that is 1
    if nums[i] == 1 and sum_of_nums == 1:
            print(i)
    #If the sum is len(nums)-1 you are looking for the one element that is 0
    if nums[i] == 0 and sum_of_nums == len(nums)-1:
        print(i)

现在关于不使用def

def用于定义类似于您从数学中知道的函数。 f(x)=x+1将以f(1)=2 , f(2)=3def = define一个输入(Math -> the x, here -> an array of Integers)并对其执行某些操作(Math -> Add 1, here -> find the element)的函数类似的方式适用于def functionName (inputParameter):

语法为def yourFunction (nums): for i in range(len(nums)): #If the sum is ==1 you are looking for the one element that is 1 if nums[i] == 1 and sum_of_nums == 1: print(i) #If the sum is len(nums)-1 you are looking for the one element that is 0 if nums[i] == 0 and sum_of_nums == len(nums)-1: print(i)

代码如上:

nums1 = [2, 4, 3]

您现在可以执行以下操作:

nums2 = [3, 5, 8] yourFunction(nums1)

然后致电:

2,它将打印yourFunction(nums2)

2,它将打印dismiss

答案 2 :(得分:0)

我将尝试逐步解释这个问题,并且根据要求,我将首先尝试避免定义函数或列表推导,并尝试解释如何从for转到列表理解或定义函数

我们从列表nums开始,我们定义了两个空列表。在一个中,我们将偶数的位置存储在nums中,而在另一个中存储奇数的位置:

#nums = [2, 4, 6, 8, 7] 
nums = [1, 3, 4, 5]
odds = []
evens = []
for i,num in enumerate (nums):
    if num % 2 == 1:
        odds.append(i)
    elif num % 2 == 0: 
        evens.append(i)

我们将打印长度为1的列表:

if len(odds)==1:
    print odds[0]
elif len(evens)==1: # or else:
    print evens[0]

有一个elif而不是其他来检查确实只有一个号码与其他号码不同,但它可以用else代替。

现在简化并使代码更加pythonic。

使用列表推导可以在同一行中创建赔率和均衡列表。因此,for循环可以简化为仅仅2行:

odds = [i for i,num in enumerate(nums) if num % 2 == 1]
evens = [i for i,num in enumerate(nums) if num % 2 == 0]

然后,如果要检查多个列表,将所有命令包装到函数中的打印件将会很有趣。这样,只需调用您定义的此函数,所有命令将立即执行。

使用def命令定义函数,然后是function_name(input1,input2...):,最后,可以选择放置包含return output1,output2...的行。在这种情况下,只有一个输入,数字列表和一个输出,奇数/偶数一个的索引,因此:

def oddeven_one_out(num_list):
    odds = [i for i,num in enumerate(nums) if num % 2 == 1]
    evens = [i for i,num in enumerate(nums) if num % 2 == 0]
    if len(odds)==1:
        result = odds[0]
    elif len(evens)==1:
        result = evens[0]
    return result

现在,可以为每个列表调用该函数:

nums1 = [1, 3, 4, 5]
print oddeven_one_out(nums1)
nums2 = [2, 4, 6, 8, 7]
print oddeven_one_out(nums2)

定义的函数有一个小问题,即如果用户输入错误并输入所有数字均匀的列表,则不会定义变量resultreturn将提出错误。

这很容易解决,有助于理解return命令。当函数遇到return时,它会离开,而不执行下面的代码。使用此行为,我们可以重新定义函数:

def oddeven_one_out(num_list):
    odds = [i for i,num in enumerate(nums) if num % 2 == 1]
    if len(odds)==1:
        return odds[0]
    evens = [i for i,num in enumerate(nums) if num % 2 == 0]
    if len(evens)==1:
        return evens[0]

现在函数检查是否只有一个奇数,如果是这种情况,则返回其位置,否则检查不同的是否为偶数,如果是,则返回其位置。此外,如果用户调用oddeven_one_out([1,3,5,7]),结果将为None,因为该函数不会返回任何值。