相关疑难解决方法(0)

Python:根据条件拆分列表?

从美学角度和绩效角度来看,根据条件将项目列表拆分为多个列表的最佳方法是什么?相当于:

good = [x for x in mylist if x in goodvals]
bad  = [x for x in mylist if x not in goodvals]
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来做到这一点?

更新:这是实际的用例,以便更好地解释我正在尝试做的事情:

# files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]
IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')
images = [f for f in files if f[2].lower() in IMAGE_TYPES]
anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]
Run Code Online (Sandbox Code Playgroud)

python

245
推荐指数
14
解决办法
14万
查看次数

python等效于filter()获取两个输出列表(即列表的分区)

假设我有一个列表和一个过滤功能.使用类似的东西

>>> filter(lambda x: x > 10, [1,4,12,7,42])
[12, 42]
Run Code Online (Sandbox Code Playgroud)

我可以得到符合标准的元素.是否有一个我可以使用的函数可以输出两个列表,一个元素匹配,剩下的元素之一?我可以filter()两次调用该函数,但这有点难看:)

编辑:元素的顺序应该是守恒的,我可能多次使用相同的元素.

python filter data-partitioning

54
推荐指数
5
解决办法
2万
查看次数

如何根据谓词拆分序列?

我经常遇到需要将一个序列拆分为满足和不满足给定谓词的元素的两个子序列(保留原始的相对排序).

这个假设的"分离器"功能看起来像这样:

>>> data = map(str, range(14))
>>> pred = lambda i: int(i) % 3 == 2
>>> splitter(data, pred)
[('2', '5', '8', '11'), ('0', '1', '3', '4', '6', '7', '9', '10', '12', '13')]
Run Code Online (Sandbox Code Playgroud)

我的问题是:

Python已经有标准/内置方式来做到这一点吗?

这个功能当然不难编码(参见下面的附录),但由于多种原因,我更喜欢使用标准/内置方法而不是自动方法.

谢谢!



附录:

到目前为止,我发现用于在Python中处理此任务的最佳标准函数是itertools.groupby.但是,要将它用于此特定任务,必须为每个列表成员调用谓词函数两次,我觉得这很烦人:

>>> import itertools as it
>>> [tuple(v[1]) for v in it.groupby(sorted(data, key=pred), key=pred)]
[('0', '1', '3', '4', '6', '7', '9', '10', '12', '13'), ('2', '5', '8', '11')]
Run Code Online (Sandbox Code Playgroud)

(上面的最后一个输出与前面所示的那个不同之处在于,满足谓词的元素的子序列是最后一个而不是第一个,但这非常小,如果需要很容易修复.)

人们可以避免对谓词的冗余调用(基本上,通过"内联memoization"),但我对此的最好的抨击得到了相当精细,与以下简单性相去甚远splitter(data, pred):

>>> first = lambda t: t[0] …
Run Code Online (Sandbox Code Playgroud)

python

23
推荐指数
3
解决办法
7338
查看次数

有没有办法捕捉列表理解中的失误?

基于简单的列表理解:

yay = [ i for i in a if a[i] ]
nay = [ i for i in a if not a[i] ]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法同时分配yaynay值(即有条件的命中和未命中)?

看起来像这样的东西

( yay , nay ) = ...
Run Code Online (Sandbox Code Playgroud)

我对可读性和速度感到好奇(看到两个列表推导比单个for循环附加到列表中的速度快5%,我感到有些惊讶)


更新:

最初的例子是在dict中获取"true"和"false"有价值键的列表...

a = {i: i >= 50 for i in range(100)}

yay = [k for k, v in a.items() if v]
nay = [k for k, v in a.items() if not v]
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
170
查看次数

标签 统计

python ×4

data-partitioning ×1

filter ×1