我必须从numpy数组中聚集连续元素.考虑以下示例
a = [ 0, 47, 48, 49, 50, 97, 98, 99]
Run Code Online (Sandbox Code Playgroud)
输出应该是一个元组列表,如下所示
[(0),(47, 48, 49, 50),(97, 98, 99)]
Run Code Online (Sandbox Code Playgroud)
这里差别只是一个.元素之间.如果差异也可以指定为限制或硬编码数字,那将是很好的.
非常感谢.
我有一个包含数据的列表:
[1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)
我想打印出连续整数的范围:
1-4, 7-8, 10-14
Run Code Online (Sandbox Code Playgroud)
是否有内置/快速/有效的方法来做到这一点?
python中是否存在可以将增加的整数列表转换为范围列表的内容
例如,给定{0,1,2,3,4,7,8,9,11}我想得到{{0,4},{7,9},{11,11}}.
我可以写一个程序来做这个,但想知道python中是否有内置函数
我有一个整数列表,我需要解析为一系列范围.
例如:
[0, 1, 2, 3] -> "0-3"
[0, 1, 2, 4, 8] -> "0-2,4,8"
Run Code Online (Sandbox Code Playgroud)
等等.
我还在学习更多pythonic处理列表的方法,这对我来说有点困难.我最近的想法是创建一个列表,跟踪配对数字:
[ [0, 3], [4, 4], [5, 9], [20, 20] ]
Run Code Online (Sandbox Code Playgroud)
然后,我可以遍历此结构,将每个子列表打印为范围或单个值.
我不喜欢在两次迭代中这样做,但我似乎无法跟踪每次迭代中的每个数字.我的想法是做这样的事情:
这是我最近的尝试.它有效,但我并不完全满意; 我一直在想,有一个更优雅的解决方案完全逃脱了我.字符串处理迭代不是最好的,我知道 - 对我来说这是很早的:)
def createRangeString(zones):
rangeIdx = 0
ranges = [[zones[0], zones[0]]]
for zone in list(zones):
if ranges[rangeIdx][1] in (zone, zone-1):
ranges[rangeIdx][1] = zone
else:
ranges.append([zone, zone])
rangeIdx += 1
rangeStr = ""
for range in ranges:
if range[0] != range[1]:
rangeStr = "%s,%d-%d" % (rangeStr, range[0], range[1])
else:
rangeStr …Run Code Online (Sandbox Code Playgroud) 我在列表中有一系列数字,我正在寻找一个优雅的解决方案,最好是列表理解,以获得单个序列(包括单个值).我已经解决了这个小问题,但它并不是非常pythonic.
以下列表定义了输入序列:
input = [1, 2, 3, 4, 8, 10, 11, 12, 17]
Run Code Online (Sandbox Code Playgroud)
期望的输出应该是:
output = [
[1, 2, 3, 4],
[8],
[10, 11, 12],
[17],
]
Run Code Online (Sandbox Code Playgroud) 在Python中,给定一个排序整数列表,我会按连续值对它们进行分组,并容忍1的间隙.
例如,给出一个列表my_list:
In [66]: my_list
Out[66]: [0, 1, 2, 3, 5, 6, 10, 11, 15, 16, 18, 19, 20]
Run Code Online (Sandbox Code Playgroud)
我想要以下输出:
[[0, 1, 2, 3, 5, 6], [10, 11], [15, 16, 18, 19, 20]]
Run Code Online (Sandbox Code Playgroud)
现在,如果我不必忍受1的差距,我可以应用这里解释的整洁解决方案:
import itertools
import operator
results = []
for k, g in itertools.groupby(enumerate(my_list), lambda (i,x):i-x):
group = map(operator.itemgetter(1), g)
results.append(group)
Run Code Online (Sandbox Code Playgroud)
有没有办法将我的额外要求纳入上述解决方案?如果没有,解决问题的最佳方法是什么?
在另一篇SO帖子中,Python用户询问如何对连续数字进行分组,使得任何序列都可以由其开始/结束来表示,并且任何散列图都将显示为单个项目.接受的答案对于连续序列非常有效.
我需要能够适应类似的解决方案,但需要一系列具有潜在(并非总是)变化增量的数字.理想情况下,我如何表示也将包括增量(因此他们将知道它是否每隔3,4,5,n)
引用原始问题,用户要求输入/输出以下内容
[2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20] # input
[(2,5), (12,17), 20]
Run Code Online (Sandbox Code Playgroud)
我想要的是以下内容(注意:为了清晰起见,我编写了一个元组作为输出,但是使用其步长变量优先选择xrange):
[2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20] # input
[(2,5,1), (12,17,1), 20] # note, the last element in the tuple would be the step value
Run Code Online (Sandbox Code Playgroud)
它还可以处理以下输入
[2, 4, 6, 8, 12, 13, 14, 15, 16, 17, 20] # input
[(2,8,2), (12,17,1), 20] # note, the last element in the tuple would be …Run Code Online (Sandbox Code Playgroud) 我想知道是否有这样做的这种相反的简单(或者已经创建)的方式: 生成联用编号列表....此链接可用于执行以下操作:
>> list(hyphen_range('1-9,12,15-20,23'))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 23]:
Run Code Online (Sandbox Code Playgroud)
我想做相反的事情(请注意,包括10和21,因此它将与范围函数兼容,其中范围(1,10)= [1,2,3,4,5,6,7,8 ,9]):
>> list_to_ranges([1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 23])
'1-10,12,15-21,23'
Run Code Online (Sandbox Code Playgroud)
最后,我想让输出还包含一个步骤,其中输出的最后一个数字表示步骤:
>> list_to_ranges([1, 3, 5, 7, 8, 9, 10, 11])
'1-13:2,8,10'
Run Code Online (Sandbox Code Playgroud)
从本质上讲,这最终会像"反向"范围函数
>> tmp = list_to_ranges([1, 3, 5])
>> print tmp
'1-7:2'
>> range(1, 7, 2)
[1, 3, 5]
Run Code Online (Sandbox Code Playgroud)
我的猜测是,没有真正简单/简单的方法可以做到这一点,但我想在我做一些蛮力,长方法之前我会问这里.
编辑
以这篇文章的答案中的代码为例,我想出了一个简单的方法来完成第一部分.但我认为确定执行步骤的模式会有点困难.
from itertools …Run Code Online (Sandbox Code Playgroud) 我有一个按顺序排列的整数列表.我希望将连续整数组作为具有每组的第一个和最后一个整数的数组.
例如,对于(2,3,4,5,8,10,11,12,15,16,17,18,25),我想得到一个包含这些数组的列表:[2,5] [8,8] ] [10,12] [15,18] [25,25]
这是我的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyRangesTest {
public static void main(String[] args) {
//create list of integers
List<Integer> list=Arrays.asList(2,3,4,5,8,10,11,12,15,16,17,18,25);
System.out.println("list:" + list);
//create a list with integers where a new sequense of consecutive integers starts or ends
List<Integer> sublistsStarsAndEnds= new ArrayList<>();
sublistsStarsAndEnds.add(list.get(0));//1st line (always in sublistsStarsAndEnds list)
for (int i=1; i<list.size()-1; i++){
if (list.get(i)>1+list.get(i-1)){
sublistsStarsAndEnds.add(list.get(i-1));
sublistsStarsAndEnds.add(list.get(i));
}
}
sublistsStarsAndEnds.add(list.get(list.size()-1));//last line (always in sublistsStarsAndEnds list)
System.out.println("sublistsStarsAndEnds: " + sublistsStarsAndEnds);//present the …Run Code Online (Sandbox Code Playgroud)