当您不知道初次值是什么时,它会在数组中发生

时间:2019-03-19 14:01:46

标签: python arrays

我有一个很长的数组(超过200万个值),具有重复值。看起来像这样:

array  = [1,1,1,1,......,2,2,2.....3,3,3.....]

具有许多不同的值。我想为每组点创建单独的数组。 IE:一个数组,两个数组,依此类推。看起来像这样:

array1 = [1,1,1,1...]
array2 = [2,2,2,2.....]
array3 = [3,3,3,3....]
.
.
.
.


None of the values occur an equal amount of time however, and I don't know how many times each value occurs.  Any advice?

5 个答案:

答案 0 :(得分:3)

假设重复值组合在一起(否则您只需要sort列表),则可以使用itertools.groupby创建嵌套列表(而不是为每个不同的值创建新列表):< / p>

from itertools import groupby
array  = [1,1,1,1,2,2,2,3,3]

[list(v) for k,v in groupby(array)]
[[1, 1, 1, 1], [2, 2, 2], [3, 3]]

请注意,这比创建n新创建的列表(如this中的示例所示)更为方便,因为您不知道将创建多少个列表,并且您将拥有通过名称来引用每个列表,而不是简单地索引嵌套列表

答案 1 :(得分:1)

您可以使用bisect.bisect_left查找每个元素首次出现的索引。仅当列表已排序时才有效:

from bisect import bisect_left

def count_values(l, values=None):
    if values is None:
        values = range(1, l[-1]+1)  # Default assume list is [1..n]
    counts = {}
    consumed = 0
    val_iter = iter(values)
    curr_value = next(val_iter)
    next_value = next(val_iter)
    while True:
        ind = bisect_left(l, next_value, consumed)
        counts[curr_value] = ind - consumed
        consumed = ind
        try:
            curr_value, next_value = next_value, next(val_iter)
        except StopIteration:
            break
    counts[next_value] = len(l) - consumed
    return counts

l = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3]

print(count_values(l))
# {1: 9, 2: 8, 3: 7}

这避免了扫描整个列表,将其替换为每个值的二进制搜索。期望在每个元素很多的情况下性能更高,而在每个元素很少的情况下性能更低。

答案 2 :(得分:0)

好吧,创建所有这些数组(每个数组仅存储重复值)似乎是浪费和冗余的。

您可能只想创建一个包含唯一值及其各自计数的字典。

通过此字典,您始终可以随时随地轻松选择要创建的单个数组中的任何一个,并且无论想要哪个特定数组。

要创建这样的字典,可以使用:

"NodeC/Node C"

有了这个字典后,就可以用 count + = i L.append(count ) return count 来获得from collections import Counter my_counts_dict = Counter(my_array) 的数量。

如果返回23,则可以使用以下方法创建my_counts_dict[23] 200的列表:

200

答案 3 :(得分:0)

****使用此代码****

<?php 
$arrayName =  array(2,2,5,1,1,1,2,3,3,3,4,5,4,5,4,6,6,6,7,8,9,7,8,9,7,8,9);
$arr = array();
foreach ($arrayName as $value) {
 $arr[$value][] = $value;
 }
  sort($arr);
 print_r($arr);
 ?>

答案 4 :(得分:0)

Solution with no helper functions:

array  = [1,1,2,2,2,3,4]

result = [[array[0]]]
for i in array[1:]:
    if i == result[-1][-1]:
        result[-1].append(i)
    else:
        result.append([i])

print(result)
# [[1, 1], [2, 2, 2], [3], [4]]