从字符串中读取数据并区分元素是数字还是数组

时间:2017-06-17 21:34:06

标签: python arrays algorithm csv

我正在阅读.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中追加带有范围元素的新数组。

2 个答案:

答案 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;
    }