从美学角度和绩效角度来看,根据条件将项目列表拆分为多个列表的最佳方法是什么?相当于:
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中存储无序集合.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) 是否有更简洁的方法将谓词拆分为两个列表?
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每个元素只计算一次是可取的.
我目前正在将一些Scala代码移植到Python中,我想知道什么是最类似于Scala的pythonic方法partition?特别是,在Scala代码中我有一种情况,我根据是否从我传入的某个过滤谓词返回true或false来分区项目列表:
val (inGroup,outGroup) = items.partition(filter)
Run Code Online (Sandbox Code Playgroud)
在Python中做这样的事情的最佳方法是什么?
我想要做
(filter-list-into-two-parts #'evenp '(1 2 3 4 5))
; => ((2 4) (1 3 5))
Run Code Online (Sandbox Code Playgroud)
其中列表被拆分为两个子列表,具体取决于谓词的计算结果是否为true.定义这样的函数很容易:
(defun filter-list-into-two-parts (predicate list)
(list (remove-if-not predicate list) (remove-if predicate list)))
Run Code Online (Sandbox Code Playgroud)
但是我想知道Lisp中是否有内置函数可以做到这一点,或者更好的方法是编写这个函数?
上下文将整数列表拆分为它们自己的偶数和奇数列表.
even = []
odd = []
for i in my_list:
if i % 2 == 0:
even.append(i)
else:
odd.append(i)
Run Code Online (Sandbox Code Playgroud)
有没有办法把上面变成一个漂亮,紧凑的列表理解...?
是否可以为以下 python 代码编写列表推导式:
for str in range(0,len(mixed_content)):
if (mixed_content[str].isdigit()):
num_list.append(mixed_content[str])
else:
string_list.append(mixed_content[str])
Run Code Online (Sandbox Code Playgroud)
我们可以在列表推导式中使用 else 块吗?我尝试为上述代码编写列表推导式:
num_list , string_list = [ mixed_content[str] for str in range(0,len(mixed_content)) if(mixed_content[str].isdigit()) else ]
Run Code Online (Sandbox Code Playgroud) 我无法理解or以下代码中的关键字的使用,该代码取自本网站的答案,该答案显示了使用reduce以下方法对列表进行分区的方法:
def partition(l, p):
return reduce(lambda x, y: x[not p(y)].append(y) or x, l, ([], []))
Run Code Online (Sandbox Code Playgroud)
我知道如果条件为真,代码将附加到第一个列表,否则它将附加到第二个列表.这部分or x做什么?我试着把它留下来,但我最后说错了TypeError: 'NoneType' object is not subscriptable
我有一个坐标列表,我需要根据它们的x值将它们分成两半.像这样的东西:
l = [(0, 0), (1, 0), (2, 0), (3, 0), (0, 1), (1, 1), (2, 1), (3, 1)]
left = []
right = []
for i in l:
if i[0] < 2:
left.append(i)
else:
right.append(i)
print(left)
print(right)
Run Code Online (Sandbox Code Playgroud)
输出:
[(0, 0), (1, 0), (0, 1), (1, 1)]
[(2, 0), (3, 0), (2, 1), (3, 1)]
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?
python ×8
common-lisp ×1
filter ×1
lisp ×1
list ×1
python-2.7 ×1
python-3.x ×1
reduce ×1
scala ×1