我有一个很长的数组(超过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?
答案 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]]