相关疑难解决方法(0)

找到两个嵌套列表的交集?

我知道如何获得两个平面列表的交集:

b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
b3 = [val for val in b1 if val in b2]
Run Code Online (Sandbox Code Playgroud)

要么

def intersect(a, b):
    return list(set(a) & set(b))

print intersect(b1, b2)
Run Code Online (Sandbox Code Playgroud)

但是当我必须找到嵌套列表的交集时,我的问题就开始了:

c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Run Code Online (Sandbox Code Playgroud)

最后我想收到:

c3 = [[13,32],[7,13,28],[1,6]]
Run Code Online (Sandbox Code Playgroud)

你能帮我个忙吗?

有关

python intersection list

468
推荐指数
10
解决办法
60万
查看次数

压扁不规则的列表列表

是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:

L = [[[1, 2, 3], [4, 5]], 6]
Run Code Online (Sandbox Code Playgroud)

期望的输出是什么

[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,一个迭代器.我看到的唯一适用于任意嵌套的解决方案可以在这个问题中找到:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

flatten(L)
Run Code Online (Sandbox Code Playgroud)

这是最好的型号吗?我忽略了什么吗?任何问题?

python optimization list flatten

412
推荐指数
16
解决办法
12万
查看次数

在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)

python list-comprehension

382
推荐指数
10
解决办法
17万
查看次数

TypeError:不可用类型:使用内置set函数时的'list'

我有一个包含多个列表作为其元素的列表

eg: [[1,2,3,4],[4,5,6,7]]
Run Code Online (Sandbox Code Playgroud)

如果我使用内置的set函数从这个列表中删除重复项,我会收到错误

TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码是

TopP = sorted(set(TopP),reverse=True)
Run Code Online (Sandbox Code Playgroud)

其中TopP是一个列表,就像在例如Above

这个set()的用法是错误的吗?有没有其他方法可以对上面的列表进行排序?

python list duplicates

35
推荐指数
2
解决办法
7万
查看次数

两个字符串列表的交集

我有一个面试问题:

给定两个无序客户列表,返回两个列表的交集列表.也就是说,返回两个列表中显示的客户列表.

我建立的一些事情:

  • 假设每个客户都有一个唯一的名称
  • 如果两个列表中的名称相同,则它是同一个客户
  • 名称是名字姓氏的名称
  • II,Jr,奇怪的角色等都没有诡计.

我认为重点是找到一种有效的算法/使用数据结构来尽可能高效地完成这项工作.

我的进展如下:

  • 将一个列表读入内存,然后一次读取另一个列表以查看是否匹配
  • 按字母顺序排列两个列表然后从一个列表的顶部开始,看看每个项目是否出现在另一个列表中
  • 将两个列表放入有序列表中,然后使用较短的列表逐项检查(这样,一个列表有2个项目,您只检查这2个项目)
  • 将一个列表放入哈希,并检查其他列表中是否存在键

面试官一直在问,"下一步是什么?",所以我想我错过了别的东西.

有效地做任何其他技巧?

旁注,这个问题是在python中,我只是阅读sets,似乎尽可能高效地做到这一点.知道数据结构/算法sets是什么?

python string algorithm set data-structures

2
推荐指数
1
解决办法
5435
查看次数