我很难搞清楚这一点并想知道是否有人能指出我正确的方向......
从此列表中:
scala > var query = csc.sql("select * from users");
scala > query.collect().foreach(println)
我试图创建:
N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
任何被发现相同的值都被分组到它自己的子列表中。
这是我到目前为止的尝试,我认为我应该使用L = [[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]]
循环?
while
答案 0 :(得分:30)
保持冷静并使用itertools.groupby
:
from itertools import groupby
N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
print([list(j) for i, j in groupby(N)])
<强>输出:强>
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
附注:当您不需要时,防止使用全局变量。
答案 1 :(得分:15)
有人提及N=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1]
它将获得[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]]
换句话说,当列表中的数字按顺序排列或者是一个混乱列表时,它就不可用。
所以我有更好的答案来解决这个问题。
from collections import Counter
N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
C = Counter(N)
print [ [k,]*v for k,v in C.items()]
答案 2 :(得分:4)
您可以将itertools.groupby
与list comprehension
>>> l = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
>>> [list(v) for k,v in itertools.groupby(l)]
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
可以像
一样将其分配给变量L
L = [list(v) for k,v in itertools.groupby(l)]
答案 3 :(得分:3)
你过度复杂了。
您要做的是:对于每个值,如果它与最后一个值相同,只需将其附加到最后一个值列表中;否则,创建一个新列表。您可以将该英语直接翻译成Python:
new_list = []
for value in old_list:
if new_list and new_list[-1][0] == value:
new_list[-1].append(value)
else:
new_list.append([value])
如果您愿意更加抽象,例如使用itertools
中的分组功能,甚至可以采用更简单的方法。但这应该很容易理解。
如果您确实需要使用while
循环执行此操作,则可以将任何for
循环转换为while
循环,如下所示:
for value in iterable:
do_stuff(value)
iterator = iter(iterable)
while True:
try:
value = next(iterator)
except StopIteration:
break
do_stuff(value)
或者,如果你知道iterable是一个序列,你可以使用一个稍微简单的while
循环:
index = 0
while index < len(sequence):
value = sequence[index]
do_stuff(value)
index += 1
但这两种方法都会降低你的代码的可读性,减少Pythonic,更复杂,效率更低,更容易出错等等。
答案 4 :(得分:0)
您也可以使用numpy来做到这一点:
import numpy as np
N = np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
counter = np.arange(1, np.alen(N))
L = np.split(N, counter[N[1:]!=N[:-1]])
此方法的优点是,当您有另一个与N相关的列表并且想要以相同的方式拆分时。
答案 5 :(得分:-1)
另一个稍微不同的解决方案,它不依赖于itertools:
#!/usr/bin/env python
def group(items):
"""
groups a sorted list of integers into sublists based on the integer key
"""
if len(items) == 0:
return []
grouped_items = []
prev_item, rest_items = items[0], items[1:]
subgroup = [prev_item]
for item in rest_items:
if item != prev_item:
grouped_items.append(subgroup)
subgroup = []
subgroup.append(item)
prev_item = item
grouped_items.append(subgroup)
return grouped_items
print group([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
# [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]