我试图找出一个整数列表是一致的还是“一次延伸”,这意味着两个相邻元素之间的差必须正好是一,并且数字必须单调地递增。我found一种简单的方法,我们可以根据列表中的数字减去元素在列表中的位置进行分组——当数字不一致时,这种差异就会改变。显然,当序列不包含间隙或重复时,应该只有一组。在

测试:>>> l1 = [1, 2, 3, 4, 5, 6]

>>> l2 = [1, 2, 3, 4, 5, 7]

>>> l3 = [1, 2, 3, 4, 5, 5]

>>> l4 = [1, 2, 3, 4, 5, 4]

>>> l5 = [6, 5, 4, 3, 2, 1]

>>> def is_coherent(seq):

... return len(list(g for _, g in itertools.groupby(enumerate(seq), lambda (i,e): i-e))) == 1

...

>>> is_coherent(l1)

True

>>> is_coherent(l2)

False

>>> is_coherent(l3)

False

>>> is_coherent(l4)

False

>>> is_coherent(l5)

False

它工作得很好,但我个人发现,考虑到问题的简单性,这个解决方案有点过于复杂。你能想出一个更清晰的方法来达到同样的效果而不显著地增加代码长度吗?在

编辑:答案摘要

根据下面给出的答案,解决方案

^{pr2}$

显然赢了。对于小列表(10^3个元素),它大约比groupby方法快10倍,而且(在我的机器上)仍然比下一个最佳方法(使用izip_longest)快4倍。它具有最差的缩放行为,但是即使对于一个包含10^8个元素的大列表,它仍然比下一个最佳方法快两倍,这也是基于izip_longest的解决方案。在

使用timeit获得的相关定时信息:Testing is_coherent_groupby...

small/large/larger/verylarge duration: 8.27 s, 20.23 s, 20.22 s, 20.76 s

largest/smallest = 2.51

Testing is_coherent_npdiff...

small/large/larger/verylarge duration: 7.05 s, 15.81 s, 16.16 s, 15.94 s

largest/smallest = 2.26

Testing is_coherent_zip...

small/large/larger/verylarge duration: 5.74 s, 20.54 s, 21.69 s, 24.62 s

largest/smallest = 4.28

Testing is_coherent_izip_longest...

small/large/larger/verylarge duration: 4.20 s, 10.81 s, 10.76 s, 10.81 s

largest/smallest = 2.58

Testing is_coherent_all_xrange...

small/large/larger/verylarge duration: 6.52 s, 17.06 s, 17.44 s, 17.30 s

largest/smallest = 2.65

Testing is_coherent_range...

small/large/larger/verylarge duration: 0.96 s, 4.14 s, 4.48 s, 4.48 s

largest/smallest = 4.66

测试代码:import itertools

import numpy as np

import timeit

setup = """

import numpy as np

def is_coherent_groupby(seq):

return len(list(g for _, g in itertools.groupby(enumerate(seq), lambda (i,e): i-e))) == 1

def is_coherent_npdiff(x):

return all(np.diff(x) == 1)

def is_coherent_zip(seq):

return all(x==y+1 for x, y in zip(seq[1:], seq))

def is_coherent_izip_longest(l):

return all(a==b for a, b in itertools.izip_longest(l, xrange(l[0], l[-1]+1)))

def is_coherent_all_xrange(l):

return all(l[i] + 1 == l[i+1] for i in xrange(len(l)-1))

def is_coherent_range(seq):

return seq == range(seq[0], seq[-1]+1)

small_list = range(10**3)

large_list = range(10**6)

larger_list = range(10**7)

very_large_list = range(10**8)

"""

fs = [

'is_coherent_groupby',

'is_coherent_npdiff',

'is_coherent_zip',

'is_coherent_izip_longest',

'is_coherent_all_xrange',

'is_coherent_range'

]

for n in fs:

print "Testing %s..." % n

t1 = timeit.timeit(

'%s(small_list)' % n,

setup,

number=40000

)

t2 = timeit.timeit(

'%s(large_list)' % n,

setup,

number=100

)

t3 = timeit.timeit(

'%s(larger_list)' % n,

setup,

number=10

)

t4 = timeit.timeit(

'%s(very_large_list)' % n,

setup,

number=1

)

print " small/large/larger/verylarge duration: %.2f s, %.2f s, %.2f s, %.2f s" % (t1, t2, t3, t4)

print " largest/smallest = %.2f" % (t4/t1)

试验机:Linux 3.2.0(Ubuntu 12.04)

Python 2.7.3(gcc 4.1.2)

使用英特尔编译器构建的numpy 1.6.2

CPU:E5-2650@2.00GHz

24 GB内存

python列表查找整数_Python:找出整数列表是否为coheren相关推荐

  1. python 列表求最大值_Python找出列表中的最大数和最小数

    Python找出列表中数字的最大值和最小值 思路: 先使用冒泡排序将列表中的数字从小到大依次排序 取出数组首元素和尾元素 运行结果: 源代码: 1 ''' 2 4.编写函数,功能:找出多个数中的最大值 ...

  2. python找出两个列表不同元素_python 找出两个列表的相同元素与不同元素

    python 找出两个列表的相同元素与不同元素,用了以下几种方法 1. 通过set 集合 list1 = [1,2,3] list2=[2,3,4] set1 = set(list1) set2 = ...

  3. numpy是python标准库吗_python – 找出Numpy是否使用了哪个BLAS库

    numpy.show_config()并不总是提供可靠的信息.例如,如果我在Ubuntu 14.04上apt-get install python-numpy,则np.show_config()的输出 ...

  4. python(dict字典相关知识以及小例子:生成一个列表,存放100个随机整数,找出出现次数最多的数字)

    一.什么是字典? #字典的使用 #子字典是一个容器类,可以用来存储数据 #列表存储数据特点:1.有序的 2.每一个都有一个索引,通过索引可以对数据进行查询,修改,删除#字典存储数据: key:valu ...

  5. python找最长的单词,Python 找出英文单词列表(list)中最长单词链

    这篇文章主要介绍了Python 找出英文单词列表(list)中最长单词链,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本文主要 ...

  6. 如何在10亿个整数中找出前1000个最大的数?

    作者:vincent-duan,专注 Java,沉迷开源,架构师社区合伙人! 面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一 ...

  7. 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。

    题目: /* 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换. */ 代码: c++做的. #include<iostream> using names ...

  8. 2.5亿个整数中找出不重复的整数

    问题描述:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数. 思路:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共 ...

  9. 如何在10亿个整数中找出前1000个最大的数(TopN算法)

    面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置 ...

  10. 剑指offer_输入n个整数,找出其中最小的K个数

    最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 本题无非就是排序,取前K个值.但选什么排序算法呢? ...

最新文章

  1. Redis (二)_ jedis的使用
  2. python学习书籍推荐-推荐python机器学习实践的书籍?
  3. ElasticSearch入门 附.Net Core例子
  4. java代码快速_java代码编写快捷途经
  5. WenLan-10亿参数!别只玩GPT,来看看人大中科院联手打造第一个大规模多模态中文预训练模型BriVL...
  6. android 开发问题----avd按钮无法按
  7. CocoaPods集成ShareSDK
  8. MindNode for Mac(思维导图)下载
  9. ireport 用html页面上 图片怎么都出不来 全是红叉的处理办法
  10. Powerpoint中VBA编程技巧
  11. sublime中PyV8问题
  12. C/C++学习笔记: 字符串匹配Sunday算法
  13. MRI T1、T2mapping
  14. Java实现系统统一对外开放网关入口设计
  15. 【Asan】工欲善其事必先利其器——AddressSanitizer
  16. 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令
  17. No valid crumb was included in the request 问题定位与解决
  18. 清除浏览器js和css缓存
  19. 移动端设置overflow-x:hiden后scrollTop失效并一直为0
  20. 最详细的MySQL大表优化方案

热门文章

  1. 文献 | 从认知和护理角度谈双相情感障碍
  2. Edge浏览器兼容性设置,实用技巧,分享给你(2023新版)
  3. Android开发——实现数字时钟
  4. Linux-安装MongoDB(详细教程)
  5. 春节不打烊,这份安全应急指南请收好!
  6. 【计算题】(六)微分方程和无穷级数
  7. Verilog 代码编写 DDS信号发生器(幅频相可调正弦波、方波、三角波、锯齿波)纯VIVADO编写仿真
  8. 微信服务商子商户支付
  9. 当女友让程序员去买西瓜...... | 每日趣闻
  10. 路径中 / ./ ../ 分别代表什么