精华内容
下载资源
问答
  • python判断连续相同数值
    2021-11-29 15:27:29

    输入为一串日期的长字符串,每个日期之间使用 "," 分隔开。

    days_str = '''2021-11-17,2021-11-19,2021-11-20,2021-11-21,2021-11-23'''

    统计连续出现日期的最大天数。        

        def calculate_consecutive_dates(dates_str: str):
            max_consecutive_days = 0
            temp_flag = 0
            dates_list = dates_str.split(",")
            dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates_list]
            date_ints = [d.toordinal() for d in dates]
    
            retlist = list()
            count = 1
            # Avoid Index Error
            for i in range(len(date_ints) - 1):
                # Check if the next number is consecutive
                if date_ints[i] + 1 == date_ints[i + 1]:
                    count += 1
                else:
                    # If it is not append the count and restart counting
                    retlist.append(count)
                    count = 1
            # In case we stop the loop earlier then we should append the last count
            retlist.append(count)
            retlist.sort(reverse=True)
            return retlist[0]

    关键函数:

    
            dates_list = dates_str.split(",") # 将字符串以某个分隔符分开,并返回一个list
            dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates_list] # 将字符串以特定形式转换为日期型数据
            date_ints = [d.toordinal() for d in dates] # d.toordinal() 将日期转换为一个正整数。
    
            # 动态编程进行运算
            retlist = list()
            count = 1
            # Avoid Index Error
            for i in range(len(date_ints) - 1):
                # Check if the next number is consecutive
                if date_ints[i] + 1 == date_ints[i + 1]:
                    count += 1
                else:
                    # If it is not append the count and restart counting
                    retlist.append(count)
                    count = 1
            # In case we stop the loop earlier then we should append the last count
            retlist.append(count)
            retlist.sort(reverse=True)
            return retlist[0]

    更多相关内容
  • 关于python检测列表中的连续整数

    千次阅读 2020-12-08 11:05:23
    我有一个包含这样的数据的列表:[1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]我想打印出连续整数的范围:1-4, 7-8, 10-14是否有内置/快速/高效的方法?请参阅stackoverflow.com/questions/2154249/,它将您指向docs....

    本问题已经有最佳答案,请猛点这里访问。

    我有一个包含这样的数据的列表:

    [1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]

    我想打印出连续整数的范围:

    1-4, 7-8, 10-14

    是否有内置/快速/高效的方法?

    请参阅stackoverflow.com/questions/2154249/,它将您指向docs.python.org/library/itertools.html#examples

    家庭作业? 您向我们展示您尝试过的方法,并看看我们是否可以做得更好。

    谢谢,我应该在问之前发现:/

    没问题,并不是那么容易找到-我只是偶然记得看到它。 您的问题并非完全相同,因为您期望的输出有些不同。

    从文档:

    >>> from itertools import groupby

    >>> from operator import itemgetter

    >>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]

    >>> for k, g in groupby(enumerate(data), lambda (i, x): i-x):

    ...     print map(itemgetter(1), g)

    ...

    [1]

    [4, 5, 6]

    [10]

    [15, 16, 17, 18]

    [22]

    [25, 26, 27, 28]

    您可以很容易地调整它,以获取一组打印范围。

    不要忘记import itertools。此外,这仅适用于Python 2.4及更高版本。

    实际上,至少在Python 2.6中,您将需要from itertools import *和from operator import *(或同等功能)。

    不要使用星级进口!切勿使用星级进口!使用from itertools import groupby和from operator import itemgetter代替。

    将lambda更改为lambda ix : ix[0] - ix[1],它可以在Python 3和Python 2中使用(嗯,不计算print语句)。

    我打算对这个答案表示赞同,因为它很聪明。不幸的是,如果我没有解释代码的作用/工作原理,就太聪明了。

    如果您的输入列表中有重复项(例如[0,1,1,2]),则此方法将不会对整个序列进行聚类;您需要先将list(set(my_original_list))调用到列表中,然后才能将其提供给此函数以获取条纹0,1,2

    对于所有尝试使用Python 3的代码的人,请阅读@Kevin的注释。另外,由于您实际上需要使用list(),因此打印语句将不起作用,如您在此处看到的stackoverflow.com/questions/7731213/基本上,您应该在Python 3中使用print(list(map(itemgetter(1), g)))

    @ dominic-rodger,如何从groupby()传递索引,以便获得值列表,但又获得对应索引的另一个列表?我感觉这是可能的,因为您正在枚举(),但无法实现。

    这将完全按照您指定的方式打印:

    >>> nums = [1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]

    >>> ranges = sum((list(t) for t in zip(nums, nums[1:]) if t[0]+1 != t[1]), [])

    >>> iranges = iter(nums[0:1] + ranges + nums[-1:])

    >>> print ', '.join([str(n) + '-' + str(next(iranges)) for n in iranges])

    1-4, 7-8, 10-14

    如果列表具有单个数字范围,则它们将显示为n-n:

    >>> nums = [1, 2, 3, 4, 5, 7, 8, 9, 12, 15, 16, 17, 18]

    >>> ranges = sum((list(t) for t in zip(nums, nums[1:]) if t[0]+1 != t[1]), [])

    >>> iranges = iter(nums[0:1] + ranges + nums[-1:])

    >>> print ', '.join([str(n) + '-' + str(next(iranges)) for n in iranges])

    1-5, 7-9, 12-12, 15-18

    这需要更多的选票。相当优雅!

    一个简短的解决方案,无需额外导入即可使用。它接受任何迭代,对未排序的输入进行排序,并删除重复项:

    def ranges(nums):

    nums = sorted(set(nums))

    gaps = [[s, e] for s, e in zip(nums, nums[1:]) if s+1 < e]

    edges = iter(nums[:1] + sum(gaps, []) + nums[-1:])

    return list(zip(edges, edges))

    例:

    >>> ranges([2, 3, 4, 7, 8, 9, 15])

    [(2, 4), (7, 9), (15, 15)]

    >>> ranges([-1, 0, 1, 2, 3, 12, 13, 15, 100])

    [(-1, 3), (12, 13), (15, 15), (100, 100)]

    >>> ranges(range(100))

    [(0, 99)]

    >>> ranges([0])

    [(0, 0)]

    >>> ranges([])

    []

    这与@dansalmo的解决方案相同,我发现了惊人的解决方案,尽管有点难以阅读和应用(因为它没有作为函数给出)。

    注意,它可以很容易地修改为吐出"传统的"开放范围[start, end),例如。更改return语句:

    return [(s, e+1) for s, e in zip(edges, edges)]

    sehr nett @coldfix

    内置:据我所知,没有。

    您必须遍历数组。首先将第一个值放在变量中并打印出来,然后只要不断按下下一个数字,除了记住另一个变量中的最后一个数字,什么都不会做。如果下一个号码不符合要求,请检查记住的最后一个号码与第一个号码。如果相同,则什么也不做。如果不同,则打印"-"和最后一个数字。然后将当前值放在第一个变量中,然后重新开始。

    在数组的末尾,您运行相同的例程,就好像碰到了一个不符合要求的数字一样。

    我当然可以编写代码,但是我不想破坏您的作业:-)

    使用设置操作,可以执行以下算法

    def get_consecutive_integer_series(integer_list):

    integer_list = sorted(integer_list)

    start_item = integer_list[0]

    end_item = integer_list[-1]

    a = set(integer_list)  # Set a

    b = range(start_item, end_item+1)

    # Pick items that are not in range.

    c = set(b) - a  # Set operation b-a

    li = []

    start = 0

    for i in sorted(c):

    end = b.index(i)  # Get end point of the list slicing

    li.append(b[start:end])  # Slice list using values

    start = end + 1  # Increment the start point for next slicing

    li.append(b[start:])  # Add the last series

    for sliced_list in li:

    if not sliced_list:

    # list is empty

    continue

    if len(sliced_list) == 1:

    # If only one item found in list

    yield sliced_list[0]

    else:

    yield"{0}-{1}".format(sliced_list[0], sliced_list[-1])

    a = [1, 2, 3, 6, 7, 8, 4, 14, 15, 21]

    for series in get_consecutive_integer_series(a):

    print series

    上面的列表" a"的输出

    1-4

    6-8

    14-15

    21

    我有一个类似的问题,正在将以下内容用于排序列表。它输出具有字典中列出的值范围的字典。键将连续数字的每次运行分开,也按顺序排列数字之间的非连续项目的运行总数。

    您的列表给了我{0: [1, 4], 1: [7, 8], 2: [10, 14]}的输出

    def series_dictf(index_list):

    from collections import defaultdict

    series_dict = defaultdict(list)

    sequence_dict = dict()

    list_len = len(index_list)

    series_interrupts = 0

    for i in range(list_len):

    if i == (list_len - 1):

    break

    position_a = index_list[i]

    position_b = index_list[i + 1]

    if position_b == (position_a + 1):

    sequence_dict[position_a] = (series_interrupts)

    sequence_dict[position_b] = (series_interrupts)

    if position_b != (position_a + 1):

    series_interrupts += 1

    for position, series in sequence_dict.items():

    series_dict[series].append(position)

    for series, position in series_dict.items():

    series_dict[series] = [position[0], position[-1]]

    return series_dict

    您可以使用具有称为Counter的类的集合库。如果尝试轮询任何可迭代的不同元素的数量,则计数器可以派上用场

    from collections import Counter

    data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]

    cnt=Counter(data)

    print(cnt)

    此输出看起来像

    Counter({1: 1, 4: 1, 5: 1, 6: 1, 10: 1, 15: 1, 16: 1, 17: 1, 18: 1, 22: 1, 25: 1, 26: 1, 27: 1, 28: 1})

    就像其他字典一样,可以查询键值

    多数民众赞成在根本没有回答问题,您只计算发生的次数而OP要求ranges

    这是不使用任何模块的另一种基本解决方案,非常适合面试,通常在他们不使用任何模块的情况下进行面试:

    #!/usr/bin/python

    def split_list(n):

    """will return the list index"""

    return [(x+1) for x,y in zip(n, n[1:]) if y-x != 1]

    def get_sub_list(my_list):

    """will split the list base on the index"""

    my_index = split_list(my_list)

    output = list()

    prev = 0

    for index in my_index:

    new_list = [ x for x in my_list[prev:] if x < index]

    output.append(new_list)

    prev += len(new_list)

    output.append([ x for x in my_list[prev:]])

    return output

    my_list = [1, 3, 4, 7, 8, 10, 11, 13, 14]

    print get_sub_list(my_list)

    输出:

    [[1], [3, 4], [7, 8], [10, 11], [13, 14]]

    展开全文
  • # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现,最先想到的就是itertools: import itertools a = [1,1,1,1,2,2,2,3,3,1,1,1,3] print max([len(list(v)) for k,v in itertools.group...

    最简单的例子:

    a = [1,1,1,1,2,2,2,3,3,1,1,1,3]
    # 问:计算a中最多有几个连续的1

    很明显,答案是4

    如果用代码实现,最先想到的就是itertools:

    import itertools
    a = [1,1,1,1,2,2,2,3,3,1,1,1,3]
    print max([len(list(v)) for k,v in itertools.groupby(a)])

    但是如果不想用itertools呢?
    可以尝试以下的办法,效率还比itertools高一个数量级!

    import random
    import time
    import itertools
    
    random.seed(0)
    a = ['1' if random.random()>0.4 else ' ' for i in range(1000000)]
    
    t = time.time()
    print max([len(x) for x in ''.join(a).split()])
    print time.time()-t
    
    t = time.time()
    print max([len(list(v)) for k,v in itertools.groupby(a)])
    print time.time()-t
    
    #####
    # 27
    # 0.050999879837
    # 27
    # 0.450000047684
    展开全文
  • python3:找出列表中的连续数字

    千次阅读 2021-04-07 21:47:33
    方法1:列表中,只有正序的数值才会作为连续,如1,2,3。逆序的则不会做为连续,如3,2,1 # 找出列表中所有连续数字 , 方法1, 正向排序才作为连续数字获取, 如果是 3 2 1 这种逆序的则不会作为连续获取 a = [1, ...

    方法1:列表中,只有正序的数值才会作为连续,如1,2,3。逆序的则不会做为连续,如3,2,1

    # 找出列表中所有连续数字 , 方法1, 正向排序才作为连续数字获取, 如果是 3 2 1 这种逆序的则不会作为连续获取
    a = [1, 2, 3, 4, 5, 7, 8, 9, 13, 45, 67, 88, 89, 90, 100, 111, 222, 223, 224, 225]  # 定义一个列表
    s = []  # 定义一个空列表
    for i in a:
        if len(s) == 0 or s[-1] + 1 == i:  # 判断,如果是空列表或者列表中最后一个值加1等于当前值
            s.append(i)  # 写入列表
        else:  # 不满足以上条件
            if len(s) >= 2:  # 判断长度是否大于2, 大于2则打印出来
                print(s)
            s = [i]  # 给s重新复制为i
    if len(s) >= 2:  # 最后一轮,判断是否是连续值,是的话就打印
        print(s)
    

    方法1:列表中,正序和逆序的连续数字均会作为连续数字获取

    # 找出列表中所有连续数字 , 方法2, sorted(set(a1))进行了一个排序,即使出现 3 2 1 这种的,依旧会作为连续数字获取出来
    a1 = [1, 2, 4, 5, 7, 9, 13, 45, 67, 88, 89, 90, 100, 111, 222, 223, 224, 225, 900, 899]  # 定义一个列表
    s1 = []   # 定义一个空列表
    for x in sorted(set(a1)):
        s1.append(x)
        if x+1 not in a1:
            if len(s1) != 1:
                print(s1)
            s1 = []
    
    展开全文
  • python判断题.docx

    2021-04-23 23:08:46
    python判断题.docx
  • Python数组中连续正值的计数

    千次阅读 2020-12-24 12:41:28
    如果有什么是清楚的,那就是“Python”。坦白地说,我甚至不能让你原来的解决方案起作用。而且,如果它真的起作用,我很好奇它是否比一个循环快。你比较过吗?现在,既然我们已经开始讨论效率,这里有一些见解。不管...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录数值型整数(int)...Python 3.x和其他语言不同,不区别长整型和整型,只要计算机内存空间足够大,整数理论上可以是无穷大。整数的数据类.
  • 温馨提示:本文包含一个送书活动。公众号近期送书活动会比较频繁,敬请关注,不要错过心仪的图书。关注公众号“Python小屋”,在本文文末留言,留言获赞最多的前10位朋友可以每人获赠《Pyth...
  • {"cells": [{"cell_type": "markdown","metadata": {},"source": ["# 条件判断和循环"]},{"cell_type": "markdown","metadata": {},"source": ["+ if语句\n","+ for循环\n","+ while循环\n","+ 列表生产式"]},{"cell...
  • 前言 找出一个列表中,所有出现的连续数字,如列表a=[1,2,3,8,6,7...判断列表中数字连续 首先得知道如何判断列表中的数字是连续的 x = [1,2,3,4] y = [5,6,8,9] 可以用到栈的知识,定义一个空列表,当成一个栈,往里面
  • Python数值区间处理(py-part)

    千次阅读 2020-11-06 18:50:05
    存在多个不连续数值区间,如 [1,10] 、[20,50] 、[100,200] … ,此时该如何高效判断一个数值在这些区间内? 问题描述2 生物学数据分析中,有时需要判断 SNPs 是否在 ChIPseq 或 ATACseq 的 peak 区域内,并删除掉...
  • Python变量重分类/Python变量重编码(连续变量重分类、离散变量重分类)
  • python这门语言中,数据类型分为两种。 内置的和自定义的。 内置的 包括数字、字符串、布尔、列表、元组、字典、Bytes、集合这些常用的以及一些不太常用的数据类型。 自定义的,一般以类的形式,根据需要组合...
  • 一、Python课程简介   Python, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。   Python是纯粹的自由软件, 源代码和解释器CPython遵循 ...
  • 前言 一些数据挖掘算法,特别是某些分类算法,如ID3算法、Apriori算法等,要求数据是分类属性形式。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。 离散化是干啥 ...将属性的值域分成具有相同
  • python等值和大小比较

    2020-11-20 19:15:23
    等值、大小比较在python中,只要两个对象的类型相同,且它们是内置类型(字典除外),那么这两个对象就能进行比较。关键词:内置类型、同类型。所以,两个对象如果类型不同,就没法比较,比如数值类型的数值不能和字符...
  • Python七种运算符

    千次阅读 2021-02-10 10:33:25
    必须是连续的片段 针对于字典,判断的是字典的键,而不是字典的值 strvar = "今天天气要下雨,赶紧回家收衣服" res = "今" in strvar res = "赶回" in strvar print(res) 身份运算符 身份运算符包含有is和is not(检测两...
  • 对列表中的数据进行遍历,然后根据元素的下标依次进行相邻位置的判断,并且要求元素是为“正常”,所以需要添加一个数值累加器,获取连续重复的次数,代码如下 输出结果如下:(判断“正常”连续重复元素共5次,与...
  • python切片判断回文

    2022-05-08 21:51:11
    回文的定义:"回文" 就是正读倒读都一样的。...普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。下面的代码初步展示了切片索引的力量。 &..
  • 数值分析实习作业 院系 学号 姓名 数据科学与计算机学院 16339053 张志宏 1.对函数f(x)f(x)f(x)进行插值 f(x)=11+x2f(x)=11+x2f(x)=\frac{1}{1+x^{2}} (1)令插值节点为等距节点−5,−4,−3,...
  • 时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)发布时间:2019-01-10 00:02,浏览次数:620, 标签:Python导读:本文介绍了数据平稳的重要性,平稳的数据对模型有什么影响。描述了如何从...
  • Python数据分析:缺失值检测与处理

    千次阅读 2021-11-12 22:31:37
    在实际的数据处理中,缺失值是普遍存在的,如何使用 Python 检测和处理缺失值,就是本文要讲的主要内容。 检测缺失值 我们先创建一个带有缺失值的数据框(DataFrame)。 import pandas as pd df = pd.DataFrame( {'A...
  • 无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路, 你的进步速度也会快很多,无论我们学习的目的是什么,不得不说Python真的是一门值得...
  • 关于怎么获得,我想其实网上有很多答案。list.index( )获得值的索引值,但是如果list中含有的值一样,例如含有两个11,22.../usr/bin/env python# -*- coding: utf-8 -*-# @Author : SundayCoder-俊勇# @File : listl...
  • Python程序设计》判断题1-240题

    千次阅读 2020-11-20 23:24:17
    1、Python是一种跨平台、开源、免费的高级动态编程语言。(对)2、Python 3.x完全兼容Python 2.x。(错)3、Python 3.x和Python 2.x唯一的区别就是:print在Python 2.x中是输出语句,而在Python 3.x中是输出函数。...
  • 我正在寻找一种在python列表中找到“高原”或组的简单方法.作为输入我有这样的事情:mydata = [0.0, 0.0, 0.0, 0.0, 0.0, 0.143, 0.0, 0.22, 0.135, 0.44, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.33, 0.65...
  • 疯狂Python讲义笔记 Python基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记
  • 在筛选数据的时候,会需要根据数据是否连续,或者连续的长度来作为筛选数据的标准。 如果计算连续值的长度 用tx-tx.shift()就可以 判断连续的标准mk,可以根据自定义需求就...在上面的代码中 根据数值相同来判定连续...
  • python高级编程1

    2022-08-03 19:43:21
    第二章 Python 中一切皆对象2.1 Python 中一切皆是对象讲解动态语言和静态语言的区别Python 的面向对象更彻底函数和类也是对象可以赋值给一个变
  • 判断语句是编程系统中最重要的语句之一。生活中有很多需要用到判断的例子。以游戏为例,王者荣耀新出了一个英雄叫暃,他的大招是“当范围内的英雄血量低于20%时被秒杀”。这个“当……时”就是典型的判断语句。我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,144
精华内容 6,857
关键字:

python判断连续相同数值