相关疑难解决方法(0)

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
查看次数

Python列表推导创建多个列表

我想创建两个列表listOfAlistOfB存储的索引AB来自另一个列表秒.

s=['A','B','A','A','A','B','B']
Run Code Online (Sandbox Code Playgroud)

输出应该是两个列表

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

我能用两个陈述来做到这一点.

listOfA=[idx for idx,x in enumerate(s) if x=='A']
listOfB=[idx for idx,x in enumerate(s) if x=='B']
Run Code Online (Sandbox Code Playgroud)

但是,我想仅使用列表推导仅在一次迭代中执行此操作.是否可以在一个声明中完成?就像是listOfA,listOfB=[--code goes here--]

python list-comprehension list

16
推荐指数
3
解决办法
2万
查看次数

将项目分组到存储桶的简单方法

我经常想在python中存储无序集合.itertools.groubpy做正确的事情,但几乎总是需要按摩来先对物品进行分类,然后在消耗之前捕捉它们.

有没有快速的方法来通过标准的python模块或简单的python习惯来获得这种行为?

>>> bucket('thequickbrownfoxjumpsoverthelazydog', lambda x: x in 'aeiou')
{False: ['t', 'h', 'q', 'c', 'k', 'b', 'r', 'w', 'n', 'f', 'x', 'j', 'm', 'p',
    's', 'v', 'r', 't', 'h', 'l', 'z', 'y', 'd', 'g'],
 True: ['e', 'u', 'i', 'o', 'o', 'u', 'o', 'e', 'e', 'a', 'o']}
>>> bucket(xrange(21), lambda x: x % 10)
{0: [0, 10, 20],
 1: [1, 11],
 2: [2, 12],
 3: [3, 13],
 4: [4, 14],
 5: [5, 15],
 6: [6, 16],
 7: [7, 17], …
Run Code Online (Sandbox Code Playgroud)

python

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

有没有办法根据条件将列表"分叉"为两个

我在团队的代码中看到过一次重复的模式,看起来像这样

numbers = [1, 2, 3, 4]
even_numbers = [n for n in numbers if n % 2 == 0]
odd_numbers = [n for n in numbers if n % 2 != 0]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有某个功能(我已经环顾四周但却找不到它)会做这样的事情

numbers = [1, 2, 3, 4]
even_numbers, odd_numbers = fork(numbers, lambda x: x % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

所以,我正在寻找的这个函数,将接收一个iterable和一个函数,并返回两个列表,一个是匹配提供条件的值,另一个是没有的.

python的标准库有没有实现这个目标?

python list

13
推荐指数
1
解决办法
726
查看次数

如何在Python中对列表中的几个值进行排序

假设

A = [9, 5, 34, 33, 32, 31, 300, 30, 3, 256]
Run Code Online (Sandbox Code Playgroud)

我想只对列表中的特定部分进行排序.例如,在这里我只想排序,[300, 30, 3]以便整个列表变为:

A = [9, 5, 34, 33, 32, 31, 3, 30, 300, 256]
Run Code Online (Sandbox Code Playgroud)

假设B = [300, 30, 400, 40, 500, 50, 600, 60]在排序之后它应该是B = [30, 300, 40, 400, 50, 500, 60, 600].

主要想法if the leftmost digit is same 300, 30, 30和最正确的数字只包含zeros然后我们应该按递增顺序排列它.

另一个例子:

A = [100, 10, 1, 2000, 20, 2]
Run Code Online (Sandbox Code Playgroud)

排序后应该是 A = [1, 10, …

python sorting list

10
推荐指数
1
解决办法
1787
查看次数

Python根据模式将列表拆分为子集

我这样做但感觉这可以用更少的代码实现.毕竟是Python.从列表开始,我根据字符串前缀将该列表拆分为子集.

# Splitting a list into subsets
# expected outcome:
# [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']]

mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b']

def func(l, newlist=[], index=0):
    newlist.append([i for i in l if i.startswith('sub_%s' % index)])
    # create a new list without the items in newlist
    l = [i for i in l if i not in newlist[index]]

    if len(l):
        index += 1
        func(l, newlist, index)

func(mylist)
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
1
解决办法
7499
查看次数

Python列表理解 - 原始列表中的"pop"结果?

假设我在Python 3.X中有一个列表.我使用list comprehension返回该列表的一个子集---是否有一种简单/ Pythonic的方式从原始列表中"弹出"该子集(因此返回后该子集中的元素不再在原始列表中) ?谢谢!

示例(我需要帮助定义my_func):

a = [1, 2, 2, 3, 4, 5]
a, b = my_func(a, *kwargs)
Run Code Online (Sandbox Code Playgroud)

我想要:

a = [1,2,2]
b = [3,4,5]

注意:我不希望一次关闭一个值,而是一次性整个子集."流行"可能不是最好的术语,但我不知道是什么.

我能想到的最好的方法是:

 temp = [idx for idx, val in enumerate(a) if val > 2]  
 b = [a[i] for i in temp]  
 a = [val for idx,val in enumerate(a) if idx not in temp]  
Run Code Online (Sandbox Code Playgroud)

显然,我更喜欢更优雅和高效的东西.我想避免两次超过列表.

编辑:我认为这个问题是独一无二的,因为我不仅仅关心拆分列表 - 我想修改原始列表.拆分并将其中一个拆分分配给原始列表变量是一种可能的解决方案,但我希望可能有一种方法可以在不明确分配给原始列表变量的情况下执行此操作(类似于b.append(a.pop(类似)) )))

python list-comprehension

8
推荐指数
1
解决办法
2912
查看次数

列表按谓词拆分

是否有更简洁的方法将谓词拆分为两个列表?

errors, okays = [], []
for r in results:
    if success_condition(r):
        okays.append(r)
    else:
        errors.append(r)
Run Code Online (Sandbox Code Playgroud)

据我所知,这可以变成丑陋的单行使用reduce; 这不是我想要的.

更新:success_condition每个元素只计算一次是可取的.

python

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

在Python中使用自定义排序参数对列表进行排序的最佳方法是什么?

我有一系列列表如下:

li1 = ['a.1', 'b.9', 'c.8', 'd.1', 'e.2']
li2 = ['a.4', 'b.1', 'c.2', 'd.2', 'e.4']
Run Code Online (Sandbox Code Playgroud)

如何重新排列每个列表中的项目,以便第一项是"b.something"?对于上面的例子:

li1 = ['b.9', 'a.1', 'c.8', 'd.1', 'e.2']
li2 = ['b.1', 'a.4', 'c.2', 'd.2', 'e.4']
Run Code Online (Sandbox Code Playgroud)

在第一个项目之后维护订单并不重要.谢谢您的帮助.

python sorting list

6
推荐指数
2
解决办法
185
查看次数