我正在阅读.csv
的数据。其中一列表示事件以格式发生的周数:
1,2,5,6,7,8,10
或1-2,5-8,10
,
或有时甚至以奇怪的混合方式,如1-2,5,6,7,8,10
。
最小周数是一个int
值(如'1'
),最大值绝不会超过两位int
(如'24'
),因为有一年52周。
第二个障碍是','
有资格作为数组的元素。所以我必须先用逗号清除字符串,然后先用(',')
将其转换为数组,然后处理主要问题。
问题:
有没有人有一个优雅的解决方案,如何区分索引处的元素是范围还是单周,如果元素是一个数组,则将该元素替换为范围长的元素,例如:
[1,3-5,7]
应该成为[1,3,4,5,7]
我尝试了什么:
我现在能想到的最好的方法是简单地计算索引处元素的长度,如果它大于2
,则假设元素是一个范围并将其拆分为'-'
。然后将每个元素(如果不是数组)复制到新数组或在for loop
中追加带有范围元素的新数组。
答案 0 :(得分:1)
检查项目中是否存在-
可能更有意义。这是我的版本:
for item in array:
if '-' in item:
item_split = list(map(int, item.split('-')))
item_list = list(range(item_split[0], item_split[1] + 1))
array.extend(item_list)
然后你必须清理你的清单以删除所有“范围”:
array = [i for i in array if not '-' in i]
假设你需要所有整数:
array = list(map(int, array))
然后删除重复项:
array = list(set(array))
答案 1 :(得分:0)
static int[] ParseStringInt32ListToIntArray(string IntegerList)
{
int[] ret;
bool contains = (IntegerList.Contains("[") == true || IntegerList.Contains(",")==true);
if (!contains)
return ret = new int[1] { Int32.Parse(IntegerList) };
IntegerList = IntegerList.Replace("-","[").Replace("[", "").Replace("]", "");
var split = IntegerList.Split(',');
ret = new int[IntegerList.Split(',').Length];
for(int i = 0;i< split.Length;i++)
{
ret[i] = Int32.Parse(split[i]);
}
return ret;
}