Python 将列表分组为列表的列表
我有一个“mylist”列表,如下所示:Python 将列表分组为列表的列表,python,list,Python,List,我有一个“mylist”列表,如下所示: l = [2,4,4,3,9,9,1] mylist = [2,4,4,3,9,9,1] results = [] for l in mylist: res = [l for l in mylist if l*2 == l] results.append(res) print (results) [[], [], [], [], [], [], []] whoops, what's error guys? 如果每个元
l = [2,4,4,3,9,9,1]
mylist = [2,4,4,3,9,9,1]
results = []
for l in mylist:
res = [l for l in mylist if l*2 == l]
results.append(res)
print (results)
[[], [], [], [], [], [], []]
whoops, what's error guys?
如果每个元素都是它的倍数,我必须对它的元素进行分组。
预期结果是:
result = [[4,4], [9,9]]
我做了如下工作:
l = [2,4,4,3,9,9,1]
mylist = [2,4,4,3,9,9,1]
results = []
for l in mylist:
res = [l for l in mylist if l*2 == l]
results.append(res)
print (results)
[[], [], [], [], [], [], []]
whoops, what's error guys?
您可以使用itertools包中的groupby来执行此操作。它被设计成像元素一样组合在一起。下面的示例首先对列表进行排序,以确保将所有匹配的项放在一起。如果不希望出现这种行为,只需删除排序,它将只对连续的匹配项进行分组
from itertools import groupby
l = [2,4,4,3,9,9,1]
x = [list(g) for _, g in groupby(sorted(l))]
x = [e for e in x if len(e) > 1]
x
# returns:
[[4, 4], [9, 9]]
使用原始代码,为输入列表的每个元素创建一个新的列表res,其中包含每个元素,该元素等于它的double(仅适用于零值),然后附加到输出列表中。 所以它根本不起作用 我可以向您推荐此解决方案,无需任何附加软件包,且易于阅读:
l = [2,4,4,3,9,9,1]
results = []
for i in set(l):
if l.count(i) > 1:
results.append([i]*l.count(i))
print(results)
我还添加了单线式解决方案:
l = [2,4,4,3,9,9,1]
results = [[i]*l.count(i) for i in set(l) if l.count(i) > 1]
print(results)
您可以使用来计算每个值在列表中出现的次数,然后使用至少出现两次的所有值创建一个新列表:
import collections
counter = collections.Counter(l)
result = [[value]*count for value, count in counter.items() if count > 1]
print(result)
# output: [[9, 9], [4, 4]]
l*2==l只有在l为零时才是真的。@ian正确的问题是为什么有人否决了我的问题?。你的问题有点难理解。如果每个元素都是它的倍数,我必须对它的元素进行分组。-什么的倍数?@ian每个数字都是自身的倍数。那不可能是你的意思。我甚至不确定你是否知道你的意思。@ian我已经发布了一个解决方案,在理解了如果每个元素都是它的倍数,那么它就意味着列表中出现多次的每个元素。这是正确的意思吗?@ian我不这么认为,但这根本不是同一个问题。我的答案是否回答了您在本页的原始问题?这是一个非常低效的解决方案。在列表上迭代并计算每个值的出现次数两次?这是二次运行时复杂性。从好的方面来说,这是一个非常可读的解决方案。