我想知道是否有一条快捷方式可以在Python列表中列出一个简单的列表.
我可以在for循环中做到这一点,但也许有一些很酷的"单行"?我用reduce尝试了,但是我收到了一个错误.
码
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Run Code Online (Sandbox Code Playgroud)
错误信息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud) 我知道如何获得两个平面列表的交集:
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)
你能帮我个忙吗?
是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:
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中将列表列表加入单个列表(或迭代器)的简短语法是什么?
例如,我有一个如下列表,我想迭代a,b和c.
x = [["a","b"], ["c"]]
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的是如下.
result = []
[ result.extend(el) for el in x]
for el in result:
print el
Run Code Online (Sandbox Code Playgroud) 我有这个嵌套列表:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Run Code Online (Sandbox Code Playgroud)
现在,我想要做的是将列表中的每个元素转换为float.我的解决方案是:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Run Code Online (Sandbox Code Playgroud)
但这可以使用嵌套列表理解来完成,对吗?
我所做的是:
[float(y) for y in x for x in l]
Run Code Online (Sandbox Code Playgroud)
但结果是一堆100的总和2400.
任何解决方案,将非常感谢解释.谢谢!
已经有一段时间了,我无法绕过我想要制作的算法.基本上,我有两个列表,并希望获得两个列表的所有组合.
我可能不会解释它是正确的,所以这是一个例子.
name = 'a', 'b'
number = 1, 2
Run Code Online (Sandbox Code Playgroud)
在这种情况下的输出将是:
1. A1 B2
2. B1 A2
Run Code Online (Sandbox Code Playgroud)
棘手的部分是"name"变量中的项目可能比"number"变量中的项目更多(数字将始终等于或小于name变量).
我很困惑如何进行所有组合(嵌套for循环?),如果名称中的项目多于它们在数字列表中的项目,则更加混淆逻辑以移动名称变量中的项目.
我不是最好的程序员但是如果有人可以帮助我澄清逻辑/算法来实现这一点,我想我可以试一试.所以我刚刚陷入嵌套for循环.
更新:
这是3个变量和2个数字的输出:
name = 'a', 'b', 'c'
number = 1, 2
Run Code Online (Sandbox Code Playgroud)
输出:
1. A1 B2
2. B1 A2
3. A1 C2
4. C1 A2
5. B1 C2
6. C1 B2
Run Code Online (Sandbox Code Playgroud) 我在Python中使用方括号有问题.我写了一个产生以下输出的代码:
[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
Run Code Online (Sandbox Code Playgroud)
但我想用它来进行一些计算,但方括号不会让我.
如何删除括号?我看到了一些例子,但我不能将它们应用于这种情况.
编辑:问题不是如何做到 - 这已经在其他问题中讨论过 - 问题是,这是最快的方法?
我之前找到了解决方案,但我想知道最快的解决方案是什么来压缩包含其他任意长度列表的列表.
例如:
[1, 2, [3, 4, [5],[]], [6]]
Run Code Online (Sandbox Code Playgroud)
会成为:
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
可以有无限多个级别.某些列表对象可以是字符串,不能将其展平为输出列表中的连续字符.
看来我的数据格式为NumPy数组列表(type() = np.ndarray):
[array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]])]
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个polyfit函数:
m1 = np.polyfit(x, y, deg=2)
Run Code Online (Sandbox Code Playgroud)
但是,它返回错误: TypeError: expected 1D vector for x
我假设我需要将我的数据展平为:
[0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654 ...]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了列表理解,它通常适用于列表列表,但是这正如预期的那样无效:
[val for sublist in risks for val in sublist]
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
如果我有序列序列(可能是元组列表),我可以使用itertools.chain()来展平它.但有时我觉得我宁愿把它写成一种理解.我只是想不出怎么做.这是一个非常具体的案例:
假设我想在序列中交换每对元素.我在这里使用字符串作为序列:
>>> from itertools import chain
>>> seq = '012345'
>>> swapped_pairs = zip(seq[1::2], seq[::2])
>>> swapped_pairs
[('1', '0'), ('3', '2'), ('5', '4')]
>>> "".join(chain(*swapped_pairs))
'103254'
Run Code Online (Sandbox Code Playgroud)
我在序列的偶数和奇数切片上使用zip来交换对.但我最终得到了一个现在需要扁平化的元组列表.所以我使用chain().有没有办法可以用理解来表达它?
如果你想发布你自己的解决方案来解决交换对的元素的基本问题,请继续,我会投票给任何教我新东西的东西.但是,即使答案是"不,你做不到",我也只会接受一个针对我的问题的答案.
python ×10
list ×6
algorithm ×2
arrays ×2
flatten ×2
optimization ×2
brackets ×1
combinations ×1
intersection ×1
nested ×1
numpy ×1
sequences ×1