偶数之和不相等

时间:2018-02-07 15:10:30

标签: python

需要任务帮助。我应该将偶数相加的偶数相加,例如我有一个像[1, 3, 2, 2, 4]这样的整数列表,输出应该是6,如果列表中的所有数字都相同,那么它应该只加2数字,例如[2, 2, 2, 2]它应打印出4但我不明白如何检查循环中数字的相等性:

a = [int(x) for x in input().split()]

for i in a:
        if i % 2 == 0:
            summ += i
        elif i == i:
            continue

4 个答案:

答案 0 :(得分:5)

不要使用循环来检查重复项。取而代之的是sum将数字放入set后的数字。

>>> lst = [1, 3, 2, 2, 4]
>>> sum(x for x in set(lst) if x % 2 == 0)
6

如果您只想过滤掉连续相同的数字,可以使用itertools.groupby“折叠”这些范围:

>>> lst = [1, 3, 2, 2, 4, 2]
>>> sum(k for k, g in itertools.groupby(lst) if k % 2 == 0)
8  # last 2 after 4 is counted
  

如果列表中的所有数字都相同,那么它应该只合计2个数字

我仍然认为这是对任务的误解或给定示例中的错误,但如果这是真正所需的行为,您可以再次将列表转换为集合,看看集合中是否只有一个元素,在这种情况下,取总和为2。

>>> lst = [2, 2, 2, 2]
>>> sum(x for x in set(lst) if x % 2 == 0) * (2 if len(set(lst)) == 1 else 1)
4
>>> lst = [1, 3, 2, 2, 4]
>>> sum(x for x in set(lst) if x % 2 == 0) * (2 if len(set(lst)) == 1 else 1)
6

此表达式的第一部分与上面相同,第二部分是三元组,根据集合的大小返回因子1或2。

答案 1 :(得分:1)

我错过了你的这部分问题:

  

如果列表中的所有数字都相同,那么它应该只合计2个数字   实例[2,2,2,2]它应打印出4

为此,您只需添加if else结构,例如:

if len(set(a))==1 and not a[0]%2:
    print(a[0]*2)
else: 
    pass
    #any approach below

尝试使用amazint Python数据结构=)

在我的例子中,我创建了一组数字,以便我们只能总结唯一值。

a = [int(x) for x in input().split()]
print(sum({num for num in a if not num%2}))

if not num%2

中还使用了隐藏的转换为bool

此外,您使用更清晰的解决方案。你的答案有点改进了:

a = [int(x) for x in input().split()]
summ=0
filt_set = set()
for num in a:
    if not num%2 and num not in filt_set:
        filt_set.add(num)
        summ+=num
print(summ)

当我们讨论搜索元素时,它使用set作为更有效的数据结构然后是列表。它还将元素同时加到元素中进行求和。

在评论讨论期间,我意识到您可能需要一个代码来仅汇总非重复数字,而不是唯一数字。我建议使用功能性Python功能:

from collections import Counter

summ = sum(map(lambda x: x[0]
        ,filter(lambda x:x[1]==1 
                ,Counter(a).items())))

print(summ)

因此,对于a = [1, 3, 2, 2, 4],我们将获得1 + 3 + 4 = 8。

你也可以用更传统的方式实现它:

elt_set = set() # a set to keep info about elements
res_set = set() # a set that we will sum up

for e in a:
# if the element happens for the first time, add it to the res_set
if e not in elt_set:
    res_set.add(e)
else if e in res_set:
# if it has been already seen before, remove it from the res_set
    res_set.remove(e)
elt_set.add(e)

print(sum(res_set))

答案 2 :(得分:1)

有很多方法,这里有两种方法:

首先,使用dict,dict键可以相同,所以只需将值作为dict中的键分配,它将是唯一的:

output={j:i for i,j in enumerate(data) if j%2==0}

然后只是布尔条件:

print([sum(output),sum(list(map(lambda x:x+x,output)))][len(output)==1])

这种情况如何运作?

布尔值是int的子类,因此[len(output)== 1]产生一个整数值,但是[' false',' true']将其作为索引值。

输出:

6

如果您所说的值相同,那么在这种情况下您需要两个数字总和:

data=[2,2,2,2]

输出:

4 

第二个使用集合:

data=[4,4,4,4]

def even_(data):
    sum_data=[]
    for i in data:
        if i%2==0:
            sum_data.append(i)
    if len(set(sum_data)) == 1:
        return list(map(lambda x: x + x, set(sum_data)))[0]
    else:
        return sum(set(sum_data))

print(even_(data))

输出:

6

答案 3 :(得分:0)

我要做的是:

db.exercise.aggregate([
            {$match : {"tags.label" : "shoot"}},
            {$sample : {size : 20}},
            {$group : {_id : null, exercise : {$push : "$$ROOT"}}},
....]