Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表分组为列表的列表_Python_List - Fatal编程技术网

Python 将列表分组为列表的列表

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? 如果每个元

我有一个“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?
如果每个元素都是它的倍数,我必须对它的元素进行分组。 预期结果是:

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我不这么认为,但这根本不是同一个问题。我的答案是否回答了您在本页的原始问题?这是一个非常低效的解决方案。在列表上迭代并计算每个值的出现次数两次?这是二次运行时复杂性。从好的方面来说,这是一个非常可读的解决方案。