python里如何在1000个数里找元素

python里如何在1000个数里找元素,第1张

如何找出数组中唯一的重复元素

数字1~1000放在含有1001个元素的数组中,其中只有唯一的元素值重复。其他数字均只出现一次。设计一个算法,将重复元素找出来,要求每个数组元素只能被访问一次。如果不使用辅助存储空间,能否使用一个算法实现。

解决方法1累加求和法

计算机与数学本身是一家,抛开计算机的专业知识不提,上述问题其实可以回归成一个数学问题。数学问题目标是在一个数字序列寻找重复的那个数。根据题目意思可以看出,1~1000个数中除了唯一一个数重复以外,其他个数仅出现一次,由数学性质可知,这1001个数包括1到1000中每一个数各一次,外加1到1000中某一个数,很显然,1001个数中有1000个数是固定的,唯一一个不固定的数也知道其范围,那么累加求和就可以找出那个数。

以数组序列(1,3,4,2,5,3) 为例,该数组长度为6,除了数字三以外,其他四个数字没有重复。按照上述方法,首先计算数组中所有数字的和sumb,sumb=1+3+4+2+5+3=18,数组中只包含1~5的数,计算1到5一共5个数的和suma=1+2+3+4+5=15,所以重复数字为sumb-suma=3;

算法性能分析:时间复杂度为O(n),空间复杂度为O(1)

解决方法2环形相遇法

“判断单链表是否存在环”是一个非常经典的问题,可以转化为“已知一个单链表中存在环,找出环的入口点”这种想法。具体思路如下:将array[i]看作是第i个元素的索引,即array[i]->array[array[i]]->array[array[array[i]]]->…最终形成一个单链表,由于数组a中存在重复元素,则一定存在一个环,且环的入口即为重复元素。

算法性能分析:时间复杂度为O(n),没有申请辅助的存储空间,当数组中的元素不合理时,上述算法可能会有数组越界的可能性。可以在执行fast=array[array[fast]];slow=array[slow]; *** 作的时候分别检查array[slow]与array[fast]是否会越界,如果越界,则说明提供的数据不合法。

解决方法3异或法

根据异或运算的性质可知,当相同元素异或时,其运算结果为0,当不同元素异或时,其运算结果为非0,任何数与数字与0异或时,其运算结果为该数。以数组(1,3,4,2,5,3)为例。(1 ^ 3 ^ 4 ^ 2 ^ 5 ^ 3 ) ^ (1^ 2^ 3^ 4^ 5)=0^ 0^ 3^ 0^0

代码如下:

算法性能分析:时间复杂度为O(n),没有申请辅助存储空间

解决方法3数据映射法

数组取值可以看成是一个特殊的函数f:D—>R,定义域为下标值1~1000,值域为1 ~ 1000,如果对于任何一个数i,f(i)叫做它的后继,i叫f(i)的前驱。0只有后继,没有前驱,其他数字有前驱也有后继,重复的那个数有两个前驱。以数组array=(1,3,4,3,5,2)为例,从下标0开始遍历数组。

(1)array[0]=1,遍历下标为1的元素,同时标记已经遍历过的元素(变为相反数),array=

(-1,3,4,3,5,2)

(2)array[1]=3,遍历下标为3的元素,同时标记已经遍历过的元素,array=(-1,-3,4,3,5,2)

(3)array[3]=3,遍历下标为3的元素,同时标记已经遍历过的元素,array=(-1,-3,4,-3,5,2)

(4)array[3]=-3,3已经遍历过,找到了重复元素。

算法性能分析:时间复杂度为O(n),也没有申请辅助的存储空间。

这种方法的缺点:修改了数组中元素的值。

有时候我们需要对excel表格中的数据去重,在行数比较多的时候,肉眼很难处理,我们可以采用Python来对excel表格进行读取 *** 作,根据某一栏,利用collection库对重复元素进行计数,获得重复元素的信息,最后根据需要在原excel表中就行删除。

最后根据结果删除重组数据所在的行,即可获得无重复数据的Excel表

num_list=[1,2,3,4,6,7,8,4,5,6,6,6]  

if len(num_list)!=len(set(num_list)):  

    print('有重复!!!')

else:  

    print('没有重复!' )

有两个方法:

使用列表的count方法,因为count方法可以做对象内的元素进行出现次数叠加计算

list1=[1,2,3,4,4,5,6,7]

list1count(1)  #结果为1

list1count(4)  #结果为2

for i in list1:

    if list1count(i)>=2:

        print('该元素%s重复'%i)

#结果:

该元素4重复

该元素4重复    #因为迭代了两次4所以有两次输出,功能是实现了,但是却打印了两次,有点不理想

2借用工厂函数set()把对象转为集合和列表的copy方法(浅复制),集合会默认把重复元素去掉

list1=[1,2,3,4,4,5,6,7]

list2=list1copy()  #为了不破坏原数据,临时浅复制给变量list2

list3=list(set(list2))  #使用set()函数将list2转为集合去掉重复元素又用list()转回列表 

for i in list3:  #对无重复元素的列表list3迭代

    if i in list2: 

        list1remove(i) #当list3内的元素存在于list2中,则把其元素从list2中删除,最后就会留下重复元素

print('list1:%s中的重复元素有:%s'%(list1,list2)) #组后输出原数据list1和最终结果list2

#结果:

list1:[1, 2, 3, 4, 4, 5, 6, 7]中的重复元素有:[4]    

#效果实现了,也没问题,就是变量使用有点多。看你选择了

举个栗子:

原数组长度,与去重后的数据,判断长度,长度相等,则证明无重复项,不相等就说明有重复项

str=[1,2,3,4,5]

if len(str)==len(set(str)):

    print "no dump"

else:

    print "dump"

a = (36, "python", [7, 23, 7, 89], {'F': '108', 'G': 88}, "python", 36, "python", '20')

b = {}

for i in a:

    if acount(i) > 1:

        b[i] = acount(i)

print(b)

打印出一个数组里所有重复元素的元素,次数:

{36: 2, 'python': 3}

list1= ['0+1998', '1+1998', '2+1998', '3+1998']

list2 = ['1+1998', '2+1998']

list3 = [1 if i in list2 else 0 for i in list1]

print(list3)

以上就是关于python里如何在1000个数里找元素全部的内容,包括:python里如何在1000个数里找元素、利用Python collection库对Excel数据去重、Python实现判断给定列表是否有重复元素的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9633104.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存