如何在Python列表中找到重复项并创建另一个重复项列表?该列表仅包含整数.
是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?
我尝试使用嵌套列表理解来压缩这样的列表,如下所示:
[image for image in menuitem for menuitem in list_of_menuitems]
Run Code Online (Sandbox Code Playgroud)
但我在NameError那里遇到麻烦,因为name 'menuitem' is not defined.谷歌搜索并浏览Stack Overflow后,我得到了一个reduce声明所需的结果:
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
但是这个方法相当难以理解,因为我需要那个list(x)调用,因为x是一个Django QuerySet对象.
结论:
感谢所有为此问题做出贡献的人.以下是我学到的内容摘要.我也将其作为社区维基,以防其他人想要添加或更正这些观察结果.
我原来的reduce语句是多余的,用这种方式编写得更好:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
这是嵌套列表理解的正确语法(Brilliant summary dF!):
>>> [image for mi in list_of_menuitems for image in mi]
Run Code Online (Sandbox Code Playgroud)
但这些方法都不如使用效率高itertools.chain:
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
正如@cdleary指出的那样,通过使用chain.from_iterable如下所示来避免*操作符魔术可能是更好的风格:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, …Run Code Online (Sandbox Code Playgroud) 我有一套套装:
setlist = [s1,s2,s3...]
Run Code Online (Sandbox Code Playgroud)
我想要s1∩s2∩s3...
我可以通过执行一系列成对s1.intersection(s2)等来编写一个函数来完成它.
有推荐的,更好的或内置的方式吗?
这里有没有人有任何有用的代码在python中使用reduce()函数?除了我们在示例中看到的通常的+和*之外,还有其他代码吗?
通过GvR 参考Python 3000中的reduce()命运
在一般的,假设你有一个像下面的方法.
def intersect_two_lists(self, list1, list2):
if not list1:
self.trap_error("union_two_lists: list1 must not be empty.")
return False
if not list2:
self.trap_error("union_two_lists: list2 must not be empty.")
return False
#http://bytes.com/topic/python/answers/19083-standard
return filter(lambda x:x in list1,list2)
Run Code Online (Sandbox Code Playgroud)
在这个特殊的方法中,当发现错误时,我不想在这种情况下返回空列表,因为这可能是这个特定方法调用的真正答案,我想返回一些东西来指示参数不正确.所以我在这种情况下错误地返回False,否则返回一个列表(空或不).
我的问题是,在这样的领域中最好的做法是什么,而不仅仅是列表?返回我想要的任何东西,并确保我记录下来供用户阅读?:-)你们大多数人都做了什么:
我想要计算两个列表的相同元素.列表可以有重复的元素,因此我无法将其转换为集合并使用&运算符.
a=[2,2,1,1]
b=[1,1,3,3]
Run Code Online (Sandbox Code Playgroud)
设置(a)和设置(b)工作
a和b不起作用
有可能用套装和dictonary吗?
我知道在Python中,如果我有:
list_1 = [1,2,3]
list_2 = [2,3,4]
Run Code Online (Sandbox Code Playgroud)
我可以做以下事情来找到两者之间的交集:
list(set(list_1) & set(list_2))
# = [2,3]
Run Code Online (Sandbox Code Playgroud)
但是这种方法存在一个问题:集合不像列表那样维护顺序.所以如果我真的有:
list_1 = [3,2,1]
list_2 = [2,3,4]
Run Code Online (Sandbox Code Playgroud)
我明白了:
list(set(list_1) & set(list_2))
# = [2,3]
Run Code Online (Sandbox Code Playgroud)
即使我更喜欢从第一个列表中获得订单,即:
# = [3,2]
Run Code Online (Sandbox Code Playgroud)
是否有另一种交叉技术可以使得到的"交集"与第一个列表保持相同的顺序?
鉴于:
g=[[], [], [0, 2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
Run Code Online (Sandbox Code Playgroud)
如何比较g中的每个列表,以便对于共享的列表,任何公共号码都可以合并到一个集合中?
例如
0存在于g[2],g[4]
因此它们合并为一组{0,2,3,7}
我尝试了以下但它不起作用:
for i in g:
for j in g:
if k in i == l in j:
m=set(i+j)
Run Code Online (Sandbox Code Playgroud)
我想做出最大可能的设定.
我已经通过查找两个列表的交集?,的两个列表字符串路口,获取两个列表的交集的蟒蛇。但是,我无法解决使用 Python 查找两个字符串列表之间的交集的问题。
我有两个变量。
A = [['11@N3'], ['23@N0'], ['62@N0'], ['99@N0'], ['47@N7']]
B = [['23@N0'], ['12@N1']]
Run Code Online (Sandbox Code Playgroud)
如何找到 '23@N0' 是 A 和 B 的一部分?
我尝试使用http://www.saltycrane.com/blog/2008/01/how-to-find-intersection-and-union-of/ 中提到的 intersect(a,b) 但是,当我尝试转换 A进入集合,它抛出一个错误:
File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
要将其转换为集合,我使用了TypeError: unhashable type: 'list' when using built-in set function中的方法,其中列表可以使用转换
result = sorted(set(map(tuple, A)), reverse=True)
Run Code Online (Sandbox Code Playgroud)
成元组,然后元组可以转换成一个集合。但是,这会返回一个空集作为交集。
你能帮我找到路口吗?
可能重复:
Python - 两个列表的交集
我正在尝试比较两个列表,以便找到它们共有的元素数量.
我遇到的主要问题是,例如,当任一列表包含重复的元素时
A = [1,1,1,1] and
B = [1,1,2,3]
Run Code Online (Sandbox Code Playgroud)
使用代码
n = 0
for x in A:
if x in B:
n += 1
print n
Run Code Online (Sandbox Code Playgroud)
给我的输出n = 4,从技术上讲,A的所有元素都在B中
我想获得输出n = 2,最好不使用套装,无论如何我可以调整我的代码,或者一种新的思考问题的方法来实现这个目标吗?
谢谢