相关疑难解决方法(0)

为什么Syntactic Sugar有时被认为是坏事?

句法糖,恕我直言,通常使程序比从极简主义的原语集编码更易读,更容易理解.我并没有真正看到好的,经过深思熟虑的语法糖的缺点.为什么有些人基本上认为语法糖最多是多余的,最糟糕的是要避免什么?

编辑:我不想命名,但是因为人们问,似乎大多数C++和Java程序员,坦率地说,他们并不关心他们的语言完全没有语法糖.在很多情况下,他们不一定非常喜欢这种语言的其他部分足以使缺糖值得权衡,这是因为他们真的不在乎.此外,Lisp程序员似乎对他们语言的奇怪符号感到骄傲(我不会将其称为语法,因为它在技术上并非如此),尽管在这种情况下,它更容易理解,因为它允许Lisp的元编程工具像它们一样强大.

language-design syntactic-sugar

13
推荐指数
5
解决办法
6023
查看次数

如何提取嵌套列表?

重复:

让我们说我有一个嵌套列表的列表:

[["a","b","c"], ["d","e","f"], ["g","h","i","j"]...]
Run Code Online (Sandbox Code Playgroud)

将它转换为单个列表的最佳方法是什么?

["a", "b", "c", "d", "e"....]
Run Code Online (Sandbox Code Playgroud)

python list

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

Python:使用索引展平嵌套列表

给定一个任意大小的任意深度嵌套列表的列表,我想在树中的所有元素上使用一个平坦的,深度优先的迭代器,但是路径指示也是如此:

for x, y in flatten(L), x == L[y[0]][y[1]]...[y[-1]]. 
Run Code Online (Sandbox Code Playgroud)

那是

L = [[[1, 2, 3], [4, 5]], [6], [7,[8,9]], 10]
flatten(L)
Run Code Online (Sandbox Code Playgroud)

应该产量:

(1, (0, 0, 0)),
(2, (0, 0, 1)),
(3, (0, 0, 2)),
(4, (0, 1, 0)),
(5, (0, 1, 1)),
(6, (1, 0)),
(7, (2, 0)),
(8, (2, 1, 0)),
(9, (2, 1, 1)),
(10, (3,))
Run Code Online (Sandbox Code Playgroud)

我使用带yield语句的生成器为此做了一个递归实现:

def flatten(l):
    for i, e in enumerate(l):
        try:
            for x, y in flatten(e):
                yield x, (i,) + y
        except: …
Run Code Online (Sandbox Code Playgroud)

python recursion iterator nested-lists flatten

12
推荐指数
2
解决办法
917
查看次数

在Python中展平字符串列表和字符串列表

类似的问题已经被问过,但这些解决方案不为我用的情况下工作(例如,制作一个平面列表出Python列表的列表压扁浅列表在Python,我已经是一个字符串列表和列表,其中嵌入列表也可以包含字符串和列表.我想将其转换为一个简单的字符串列表,而不将字符串拆分为字符列表.

import itertools

list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image03', 'image04']]]
chain = itertools.chain(*list_of_menuitems)
Run Code Online (Sandbox Code Playgroud)

结果清单:

['i', 'm', 'a', 'g', 'e', '1', '0', 'image00', 'image01', 'image02', ['image03', 'image04']]
Run Code Online (Sandbox Code Playgroud)

预期结果:

['image10', 'image00', 'image01', 'image02', 'image03', 'image04']
Run Code Online (Sandbox Code Playgroud)

什么是最好的(Pythonic)方法呢?

python list

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

理解列表理解,以便在python中展平列表列表

我发现这种理解非常适用于展平列表列表:

>>> list_of_lists = [(1,2,3),(2,3,4),(3,4,5)]
>>> [item for sublist in list_of_lists for item in sublist]
[1, 2, 3, 2, 3, 4, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

我喜欢这比使用更好itertools.chain(),但我无法理解它.我试过用括号括起来的部分,看看我是否可以减少复杂性,但现在我只是更加困惑:

>>> [(item for sublist in list_of_lists) for item in sublist]
[<generator object <genexpr> at 0x7ff919fdfd20>, <generator object <genexpr> at 0x7ff919fdfd70>, <generator object <genexpr> at 0x7ff919fdfdc0>]

>>> [item for sublist in (list_of_lists for item in sublist)]
[5, 5, 5]
Run Code Online (Sandbox Code Playgroud)

我觉得我很难理解,因为我不太明白发电机是如何工作的......我的意思是,我以为我做了,但现在我真的很怀疑.就像我说的,我喜欢这个成语是多么紧凑,这正是我需要的,但我不愿意使用我不理解的代码.

谁能解释一下究竟发生了什么?

python list-comprehension list generator

10
推荐指数
2
解决办法
3665
查看次数

并行python迭代

我想基于a中的值创建一个类的实例pandas.DataFrame.我已经失败了.

import itertools
import multiprocessing as mp
import pandas as pd

class Toy:
    id_iter = itertools.count(1)

    def __init__(self, row):
        self.id = self.id_iter.next()
        self.type = row['type']

if __name__ == "__main__":

    table = pd.DataFrame({
        'type': ['a', 'b', 'c'],
        'number': [5000, 4000, 30000]
        })

    for index, row in table.iterrows():
        [Toy(row) for _ in range(row['number'])]
Run Code Online (Sandbox Code Playgroud)

多处理尝试

我已经能够通过添加以下内容来并行化这种(某种程度):

pool = mp.Pool(processes=mp.cpu_count())
m = mp.Manager()
q = m.Queue()

for index, row in table.iterrows():
    pool.apply_async([Toy(row) for _ in range(row['number'])])
Run Code Online (Sandbox Code Playgroud)

如果数字row['number']显着长于长度,这似乎会更快table.但在我的实际情况中,table …

python pandas python-multiprocessing

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

LISP在python中有所体现

consPython中有相同的东西吗?(2.5以上的任何版本)

如果是这样,它是否内置?或者我需要easy_install做一个模块吗?

lisp python cons

8
推荐指数
2
解决办法
6795
查看次数

从 itertools.chain 对象获取一个数组

假设我有list_of_numbers = [[1, 2], [3], []]并且想要更简单的对象列表对象x = [1, 2, 3]

按照这个相关解决方案的逻辑,我做

list_of_numbers = [[1, 2], [3], []]
import itertools
chain = itertools.chain(*list_of_numbers)
Run Code Online (Sandbox Code Playgroud)

不幸的是,chain这并不完全是我想要的,因为(例如)chain在控制台上运行会返回<itertools.chain object at 0x7fb535e17790>.

f如果我这样做x = f(chain)然后x在控制台上输入我得到的功能是什么[1, 2, 3]

更新: 实际上我最终需要的结果是array([1, 2, 3])。我在所选答案的评论中添加一行来解决这个问题。

python python-itertools

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

将列表解压缩到元组中间

我有一个不确定大小的列表:

l = [...]
Run Code Online (Sandbox Code Playgroud)

我想将此列表解压缩为具有其他值的元组,但以下操作失败:

t = ("AA", "B", *l, "C")
Run Code Online (Sandbox Code Playgroud)

我如何形成以下内容?

t = ("AA", "B", l[0], ..., l[:-1], "C")
Run Code Online (Sandbox Code Playgroud)

编辑:只做片[a:b]也不错:

t = ("AA", "B", l[a], ..., l[b], "C")
Run Code Online (Sandbox Code Playgroud)

python tuples list python-3.x

8
推荐指数
2
解决办法
2703
查看次数

获得列表联合的最快方法 - Python

有一个C++比较从列表列表中获取列表的并集:找到集合的最快方法

还有其他几个与python相关的问题,但没有一个提出了加入列表的最快方法:

从答案中,我发现至少有两种方法可以做到:

>>> from itertools import chain
>>> x = [[1,2,3], [3,4,5], [1,7,8]]
>>> list(set().union(*x))
[1, 2, 3, 4, 5, 7, 8]
>>> list(set(chain(*x)))
[1, 2, 3, 4, 5, 7, 8]
Run Code Online (Sandbox Code Playgroud)

请注意,我之后将该集转换为列表,因为我需要修复列表的顺序以进行进一步处理.

经过一些比较,似乎list(set(chain(*x)))更稳定,花费的时间更少:

from itertools import chain
import time
import random

# Dry run.
x = [[random.choice(range(10000)) 
    for i in range(10)] for j in range(10)]
list(set().union(*x))
list(set(chain(*x)))

y_time = 0
z_time = 0

for _ in range(1000):
    x = [[random.choice(range(10000)) 
        for i …
Run Code Online (Sandbox Code Playgroud)

python union numpy list set

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