-
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]]
-
python中计算一个列表中连续相同的元素个数
2018-03-05 19:15:46# 问:计算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:46python判断题.docx -
Python数组中连续正值的计数
2020-12-24 12:41:28如果有什么是清楚的,那就是“Python”。坦白地说,我甚至不能让你原来的解决方案起作用。而且,如果它真的起作用,我很好奇它是否比一个循环快。你比较过吗?现在,既然我们已经开始讨论效率,这里有一些见解。不管... -
Python基础知识:数据类型--数值型
2022-04-09 09:10:19提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录数值型整数(int)...Python 3.x和其他语言不同,不区别长整型和整型,只要计算机内存空间足够大,整数理论上可以是无穷大。整数的数据类. -
Python快速判断若干整数是否互不相同
2021-07-13 17:29:27温馨提示:本文包含一个送书活动。公众号近期送书活动会比较频繁,敬请关注,不要错过心仪的图书。关注公众号“Python小屋”,在本文文末留言,留言获赞最多的前10位朋友可以每人获赠《Pyth... -
python基础4—条件判断和循环.ipynb
2020-12-18 12:22:12{"cells": [{"cell_type": "markdown","metadata": {},"source": ["# 条件判断和循环"]},{"cell_type": "markdown","metadata": {},"source": ["+ if语句\n","+ for循环\n","+ while循环\n","+ 列表生产式"]},{"cell... -
python面试题:找出列表中出现的所有连续数字
2021-04-08 15:22:52前言 找出一个列表中,所有出现的连续数字,如列表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] 变量重分类(连续变量重分类、离散变量重分类)
2021-12-19 09:35:34Python变量重分类/Python变量重编码(连续变量重分类、离散变量重分类) -
Python基础数据类型(一)——数据、数值和布尔类型
2021-07-29 00:08:37在python这门语言中,数据类型分为两种。 内置的和自定义的。 内置的 包括数字、字符串、布尔、列表、元组、字典、Bytes、集合这些常用的以及一些不太常用的数据类型。 自定义的,一般以类的形式,根据需要组合... -
Python学习:001数值及数据类型
2020-04-21 19:16:37一、Python课程简介 Python, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。 Python是纯粹的自由软件, 源代码和解释器CPython遵循 ... -
Python 连续数据离散化最通俗的理解与操作
2021-01-05 18:26:40前言 一些数据挖掘算法,特别是某些分类算法,如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(检测两... -
【python数据处理】pandas根据多列连续重复值的总和数量判断向新一列添加内容
2022-06-14 23:33:36对列表中的数据进行遍历,然后根据元素的下标依次进行相邻位置的判断,并且要求元素是为“正常”,所以需要添加一个数值累加器,获取连续重复的次数,代码如下 输出结果如下:(判断“正常”连续重复元素共5次,与... -
python切片判断回文
2022-05-08 21:51:11回文的定义:"回文" 就是正读倒读都一样的。...普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。下面的代码初步展示了切片索引的力量。 &.. -
数值分析实习作业(各种插值函数与积分公式的python代码实现)
2018-06-11 09:36:48数值分析实习作业 院系 学号 姓名 数据科学与计算机学院 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)
2020-12-02 21:03:14时间序列预测基础教程系列(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入门知识点整理成手册了-背记手册,高清PDF下载
2022-07-01 11:46:13无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路, 你的进步速度也会快很多,无论我们学习的目的是什么,不得不说Python真的是一门值得... -
获取python的list中含有重复值的index方法
2020-12-10 11:28:00关于怎么获得,我想其实网上有很多答案。list.index( )获得值的索引值,但是如果list中含有的值一样,例如含有两个11,22.../usr/bin/env python# -*- coding: utf-8 -*-# @Author : SundayCoder-俊勇# @File : listl... -
《Python程序设计》判断题1-240题
2020-11-20 23:24:171、Python是一种跨平台、开源、免费的高级动态编程语言。(对)2、Python 3.x完全兼容Python 2.x。(错)3、Python 3.x和Python 2.x唯一的区别就是:print在Python 2.x中是输出语句,而在Python 3.x中是输出函数。... -
python – 在列表中查找值为!= 0的值组
2020-12-06 12:14:12我正在寻找一种在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基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记 共197页.pdf
2022-05-24 22:47:31疯狂Python讲义笔记 Python基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记 -
数据分析--pandas 判断数据是否连续,连续的长度
2022-07-11 10:22:55在筛选数据的时候,会需要根据数据是否连续,或者连续的长度来作为筛选数据的标准。 如果计算连续值的长度 用tx-tx.shift()就可以 判断连续的标准mk,可以根据自定义需求就...在上面的代码中 根据数值相同来判定连续... -
python高级编程1
2022-08-03 19:43:21第二章 Python 中一切皆对象2.1 Python 中一切皆是对象讲解动态语言和静态语言的区别Python 的面向对象更彻底函数和类也是对象可以赋值给一个变 -
Python基础回顾(6)——用于判断的“if”语句
2022-01-24 12:21:41判断语句是编程系统中最重要的语句之一。生活中有很多需要用到判断的例子。以游戏为例,王者荣耀新出了一个英雄叫暃,他的大招是“当范围内的英雄血量低于20%时被秒杀”。这个“当……时”就是典型的判断语句。我...