Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Range - Fatal编程技术网

使用python,如何合并或联接两个列表,使其值不';不重叠?

使用python,如何合并或联接两个列表,使其值不';不重叠?,python,list,range,Python,List,Range,首先,我为我不准确的词汇道歉。我是一个绝对的零起点初学者。无论如何,我试图解决这个问题: 简单地说,我正在尝试编写一个脚本,它将找到1000以下所有3或5的倍数之和 我的(非常基本的)方法是使用这个程序: ##Multiples of 3 x = range(3, 1000, 3) ##Multiples of 5 y = range(5, 1000, 5) a = sum(x) b = sum(y) n = a + b print n 我意识到这是错误的,因为像15这样的数字包含了两

首先,我为我不准确的词汇道歉。我是一个绝对的零起点初学者。无论如何,我试图解决这个问题:

简单地说,我正在尝试编写一个脚本,它将找到1000以下所有3或5的倍数之和

我的(非常基本的)方法是使用这个程序:

##Multiples of 3
x = range(3, 1000, 3)

##Multiples of 5
y = range(5, 1000, 5)

a = sum(x)
b = sum(y)
n = a + b

print n
我意识到这是错误的,因为像15这样的数字包含了两次(它是5和3的倍数)。 那么,是有办法解决这个问题,还是我从一个完全错误的角度来处理这个问题? 或者在我尝试解决这个问题之前,我需要学习更多吗? 我也很抱歉,如果这已经解释了在以前的帖子,但我环顾了一下周围

简单方法:

sum(集合(x+y))

有一个相当多的功能,你会发现有用的PE问题


你也可以很容易地在整个范围内通过一个简单的循环来完成

您可以使用
集合
消除重复项:

>>> len(x)
333
>>> len(y)
199
>>> s = set(x + y)
>>> len(s)
532
然后您可以对集合中的成员进行求和。

您正在寻找的


根据您正在执行的操作,您必须更改代码。上述操作将
y
中的所有内容从
x
中删除。这就像列表,但你可以对项目进行算术运算

它被称为包含排除原理,所以你可以像

##Multiples of 3
x = range(3, 1000, 3)

##Multiples of 5
y = range(5, 1000, 5)

##multiple of 15 are counted twice
z=range(15,1000,15)


a = sum(x)
b = sum(y)
c = sum(z)
n = a + b -c
print(n)
但美在于使用生成器或列表理解

a = sum(i for i in range(1000) if i%3 == 0 or i%5 == 0 )
print(a)
其中%是整数除法中的余数。 很好的一点是,代码读起来非常流利,是规则的直接翻译,可以从左到右阅读

这两种算法的运行时间取决于n,在这种情况下,n是1000。例如,如果n为100000000,则必须等待很长时间才能完成。如果你运用一点数学,你会发现

sum(a for a in range(a1,a2,n)) 

实际上是,无论n有多大,都可以在恒定的时间内计算出它的总和

要合并已排序的序列,可以使用:

要删除重复的项目,您可以使用:

在这种情况下,
unique\u justseen()
可以简化为:

from itertools import groupby, imap
from operator  import itemgetter

def unique_justseen(iterable):
    return imap(itemgetter(0), groupby(iterable))
这些函数不要求输入参数是序列。它们接受任意可数(包括无限),例如,生成3或5倍的无限序列:

import heapq
from itertools import count, takewhile

m3, m5 = count(3, 3), count(5, 5) 
m3_5 = heapq.merge(m3, m5)
uniq_m3_5 = unique_justseen(m3_5) # *all* unique multiples of 3 or 5
要找到解决方案:

print sum(takewhile(lambda x: x < 1000, uniq_m3_5))
# -> 233168
# check that it is correct
print sum(set(range(3, 1000, 3) + range(5, 1000, 5)))
# -> 233168
print sum(x for x in xrange(1000) if x % 3 == 0 or x % 5 == 0)
# -> 233168
print sumk(3, 1000) + sumk(5, 1000) - sumk(15, 1000)
# -> 233168

这个公式是由提供的。

我不知道这是否效率较低,但制作两个集合并对这两个集合进行布尔运算以删除重复项似乎是多余的,因为集合的定义是


(增加重点)

因此,只需将两个范围添加到一个集合,并让“创建”集合移除重复:

sum(set(range(3, 1000, 3) + range(5, 1000, 5)))

你需要保留顺序吗?因为我只需要总数,我很确定顺序不会影响我的结果。啊,对。我没有对这个问题给予足够的重视
set
应该可以正常工作。解决问题后,请确保阅读unlocked forum以获取此问题的答案。有比利用
set
behavior.Woah更优雅、更有效的方法。我查阅了其他人的解决方案,但我完全没有经验去理解其中的任何一个。他们都在使用我从没听说过的函数。解决方案更复杂是否更好?我想这些类型的解决方案更能证明你的能力,嗯?好吧,我现在满足于我的简单。非常感谢你!那很有效!不过,老实说,我几乎不知道“set”函数的作用。我显然有很多东西要学,但无论如何,再次感谢你@Grant时,set函数在其他列表上创建一组操作。现在,由于集合元素不会重复,如果它在创建集合时遇到重复的实体,它将只保留其中一个。要在@AbhranilDas的注释中添加一点内容:
set
以无序的方式将您添加的每个元素存储一次,并执行诸如“x中的a”或“x中的a”之类的操作“一切都在x中,但不是在y中“又快又容易。在这种情况下,我们利用的是所有东西都是唯一存储的:它可以只存在一次。我已链接到python文档,如果您有任何疑问,请随时告诉我们^ ^ ^ ^ ^从本质上说,集合相当于列表,但它没有重复的“实体”?等待那不可能是对的。哈哈,我想我还是去看看python的文档吧。无论如何,谢谢。啊,我明白了。哇,我真的很喜欢你的解决方案。我从来没有想到15的倍数是唯一被重复的倍数。我不应该感到惊讶。我还在上中学,我的数学也不算太高。但再次感谢!
import heapq
from itertools import count, takewhile

m3, m5 = count(3, 3), count(5, 5) 
m3_5 = heapq.merge(m3, m5)
uniq_m3_5 = unique_justseen(m3_5) # *all* unique multiples of 3 or 5
print sum(takewhile(lambda x: x < 1000, uniq_m3_5))
# -> 233168
# check that it is correct
print sum(set(range(3, 1000, 3) + range(5, 1000, 5)))
# -> 233168
print sum(x for x in xrange(1000) if x % 3 == 0 or x % 5 == 0)
# -> 233168
print sumk(3, 1000) + sumk(5, 1000) - sumk(15, 1000)
# -> 233168
def sumk(k, n):
    m = (n-1)//k
    return k*m*(m+1)//2
sum(set(range(3, 1000, 3) + range(5, 1000, 5)))