根据未知子列表中的出现次数获取列表
我想找到一个方法,把下面的列表(a
)变成一个新的列表(b
),有两个条件:
- 新列表(
b
)的顺序是根据值在中的出现次数来决定的。 - 每个值只能出现一次。
简单来说,就是把a
变成b
:
a = [[1,2,3,4], [2,3,4], [4,5,6]]
# value 4 occurs 3 times in list a and gets first position
# value 2 occurs 2 times in list a and get second position and so on...
b = [4,2,3,1,5,6]
我想这可以通过使用set
和一些列表操作来实现。但是当a
可以包含任意数量的列表时,我就搞不清楚了。a
这个列表是根据用户输入创建的(我猜它可以包含1到20个列表,每个列表里有200到300个项目)。
我尝试用[set(l) for l in a]
这样的方式,但不知道怎么把set(l) & set(l)....
结合起来,以获取所有匹配的项目。
有没有可能不使用for
循环,去遍历子列表的数量乘以子列表中的项目数量呢?
4 个回答
1
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够清晰,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个函数时,发现它的表现和预期不一样,这时候就需要仔细检查代码,看看是不是哪里出了问题。
另外,编程的世界里有很多术语和概念,刚开始接触的时候可能会觉得很复杂。其实,只要慢慢来,多实践,就能逐渐理解这些内容。遇到不懂的地方,可以查阅资料或者向别人请教,大家都是从小白过来的。
总之,编程是一门需要耐心和细心的技能,遇到问题时不要气馁,认真分析,逐步解决,就一定能进步。
import itertools
all_items = set(itertools.chain(*a))
b = sorted(all_items, key = lambda y: -sum(x.count(y) for x in a))
1
试试这个 -
a = [[1,2,3,4], [2,3,4], [4,5,6]]
s = set()
for l in a:
s.update(l)
print s
#set([1, 2, 3, 4, 5, 6])
b = list(s)
这样做会把每个列表里的元素都放到一个集合里,这样你就能得到所有列表中元素的唯一集合。如果你想要的是这个的话。
补充一下。如果你想保持原列表中元素的顺序,就不能使用集合。
a = [[1,2,3,4], [2,3,4], [4,5,6]]
b = []
for l in a:
for i in l:
if not i in b:
b.append(i)
print b
#[1,2,3,4,5,6] - The same order as the set in this case, since thats the order they appear in the list
4
我觉得这可能是你能找到的最接近的答案:
from collections import defaultdict
d = defaultdict(int)
for sub in outer:
for val in sub:
d[val] += 1
print sorted(d.keys(), key=lambda k: d[k], reverse = True)
# Output: [4, 2, 3, 1, 5, 6]
有一种可能性是,出现次数相同的元素顺序可能是不确定的——也就是说,d.keys()
的输出顺序是不固定的。