小编tel*_*t99的帖子

压扁不规则的列表列表

是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:

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 optimization list flatten

412
推荐指数
16
解决办法
12万
查看次数

如何在matplotlib中首先绘制线条并指向最后一点

我有一个简单的情节,有几组连接每组的点和线.我希望将点绘制在线的顶部(以便该线不显示在该点内).无论电话plotscatter电话的顺序如何,这个情节都是一样的,而不是我想要的.有一个简单的方法吗?

import math
import matplotlib.pyplot as plt

def poisson(m):
    def f(k):
        e = math.e**(-m)
        f = math.factorial(k)
        g = m**k
        return g*e/f
    return f

R = range(20)
L = list()
means = (1,4,10)
for m in means:
    f = poisson(m)
    L.append([f(k) for k in R])
colors = ['r','b','purple']

for c,P in zip(colors,L):
    plt.plot(R,P,color='0.2',lw=1.5)
    plt.scatter(R,P,s=150,color=c)

ax = plt.axes()
ax.set_xlim(-0.5,20)
ax.set_ylim(-0.01,0.4)
plt.savefig('example.png')
Run Code Online (Sandbox Code Playgroud)

python matplotlib

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

Cython:从外部C文件调用函数

在Cython的"Hello World"以及在这里调用C数学库中的函数的例子之后,我真正想做的是在一个单独的文件中使用我自己的C代码并在Cython中使用它.在之后,我修改setup.py文件:

sourcefiles = ['hello2_caller.pyx', 'hello2.c']
Run Code Online (Sandbox Code Playgroud)

这是hello2.c(主要是单独编译和测试它 - 虽然该测试不存在该产品:

#import <stdio.h>

void f() {
    printf("%s", "Hello world!\n");
}

int main(int argc, const char* argv[]) {
    f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是hello2_caller.pyx

cdef extern from "hello2.c":
    void f()

cpdef myf():
    f()
Run Code Online (Sandbox Code Playgroud)

我明白了:

In file included from hello2_caller.c:219:
hello2.c:3: warning: function declaration isn’t a prototype
Run Code Online (Sandbox Code Playgroud)

所以我想我没有以某种方式提供标题..虽然只是喂了setup.py标准的标题如'hello2.h'不起作用.你能指点我一个工作的例子或解释我做错了什么.谢谢.

cython

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

Python:怎么这么快?

在模块中使用的Mersenne Twister的时期random是(我被告知)2**19937 - 1.作为二进制数,这是19937'连续1(如果我没有记错的话).Python将其转换为十进制相当快速:

$ python -m timeit '2**19937'
10000000 loops, best of 3: 0.0271 usec per loop

$ python -m timeit -s 'result = 0' 'result += 2**19937'
100000 loops, best of 3: 2.09 usec per loop
Run Code Online (Sandbox Code Playgroud)

我想第二个版本是需要转换的版本?

它不仅仅是二元的.这也很快.(而不是显示数字,我显示转换为字符串的小数的长度):

>>> import math
>>> N = 1000
>>> s = str((int(N*math.e))**(int(N*math.pi)))
>>> len(s)
10787
>>> N = 5000
>>> s = str((int(N*math.e))**(int(N*math.pi)))
>>> len(s)
64921
Run Code Online (Sandbox Code Playgroud)

定时:

python -m timeit -s 'import math' -s 'N=1000' 's = str((int(N*math.e))**(int(N*math.pi)))'
10 …
Run Code Online (Sandbox Code Playgroud)

python largenumber computation

6
推荐指数
3
解决办法
903
查看次数

Python:使用itertools将列表拆分为组的参数

这是一个关于使用标准库的快速代码的相对优点的问题,但是对于手动的替代方案而言是模糊的(至少对我而言).在这个线程(以及它复制的其他线程)中,似乎将列表分成组的"Pythonic"方法是使用itertools,如下面的代码示例中的第一个函数(稍微从ΤΖΩΤΖΙΟΥ修改).

我更喜欢第二个功能的原因是我可以理解它是如何工作的,如果我不需要填充(将DNA序列转换成密码子,比方说),我可以立即从内存中重现它.

itertools的速度更快.特别是如果我们不希望列表返回,或者我们想要填充最后一个条目,则itertools会更快.

还有哪些其他参数支持标准库解决方案?

from itertools import izip_longest

def groupby_itertools(iterable, n=3, padvalue='x'):
    "groupby_itertools('abcde', 3, 'x') --> ('a','b','c'), ('d','e','x')"
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

def groupby_my(L, n=3, pad=None):
    "groupby_my(list('abcde'), n=3, pad='x') --> [['a','b','c'], ['d','e','x']]"
    R = xrange(0,len(L),n)
    rL = [L[i:i+n] for i in R]
    if pad:
        last = rL[-1]
        x = n - len(last)
        if isinstance(last,list):
            rL[-1].extend([pad] * x)
        elif isinstance(last,str):
            rL[-1] += pad * x
    return rL
Run Code Online (Sandbox Code Playgroud)

定时:

$ python -mtimeit -s 'from groups import groupby_my, …
Run Code Online (Sandbox Code Playgroud)

python

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

Python在内存中的低值内容布局

我的问题是:这些模式(下面)在哪里产生?

我学到了(某处)Python有独特的"副本",如果这是正确的单词,对于小整数.例如:

>>> x = y = 0
>>> id(0)
4297074752
>>> id(x)
4297074752
>>> id(y)
4297074752
>>> x += 1
>>> id(x)
4297074728
>>> y
0
Run Code Online (Sandbox Code Playgroud)

当我查看整数的内存位置时,早期有一个简单的模式:

>>> N = id(0)
>>> for i in range(5):
...     print i, N - id(i)
... 
0 0
1 24
2 48
3 72
4 96
>>> bin(24)
'0b11000'
Run Code Online (Sandbox Code Playgroud)

我不清楚为什么选择这个作为增量.而且,我无法解释256以上的这种模式:

>>> prev = 0
>>> for i in range(270):
...     t = (id(i-1), id(i))
...     diff = t[0] - t[1]
...     if …
Run Code Online (Sandbox Code Playgroud)

python memory

5
推荐指数
1
解决办法
549
查看次数

为 Web 格式化 Python 代码

直到最近,我使用以下内容将 Python 代码(空格很重要)发布到 blogspot.com:

<div style="overflow-x: scroll "> 
<table bgcolor="#ffffb0" border="0" width="100%" padding="4"> 
<tbody><tr><td><pre style=" hidden;font-family:monaco;"> 
my code here 
</pre></table></div> 
Run Code Online (Sandbox Code Playgroud)

大约一周前,帖子开始获取额外的换行符,因此所有这些都是双倍行距的。使用简单的<pre>标签是不好的(除了失去颜色)b/c 它还导致双换行符,而<code>标签与空白混淆。我想我可以只添加&nbsp;*4 ---但这是不赞成的或者 HTML 风格的上帝。

对此的标准答案(就像在 SO 上一样)是通过使用 css(我不太了解)来获得语法着色或突出显示,例如在上一个 SO question here 中讨论的那样。我遇到的问题是所有这些解决方案都需要从 Web 上的服务器加载资源。但是,如果(例如 5 年后)该资源消失了,则代码的 html 版本将根本无法呈现。如果我知道 Javascript,我想我可能会解决这个问题。

着色问题本身是微不足道的,可以通过使用<style>具有各种定义的标签来解决。但是解析很困难;至少我在尝试自己解析 Python 方面没有取得太大进展。多行字符串是一种特殊的痛苦。我可以忽略困难的情况并编写简单的情况。

TextMate 有一个命令Create HTML from Document。结果相当冗长,但可以粘贴到帖子中。但是如果你有 3 个代码段,那么它就像 1000 行或其他东西。当然,它是一个文档,因此您必须在粘贴之前进行实际剪切。

有没有简单的 Python 解析器?更好的解决方案?

更新:我编写了自己的语法高亮解析器。也许仍然有点问题,但它非常简单且是一个独立的解决方案。我把它贴在这里。Pygments 也是一个不错的选择。

html css python

5
推荐指数
1
解决办法
5554
查看次数

从Objective-C调用Python

bbum 发布了如何执行此操作的大纲,但我无法完成详细信息.Python代码在哪里,我的Objective-C代码将如何知道它?我如何在命令行上进行编译?

python objective-c

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

为什么我在Python中使用random.shuffle获取重复?

对于10个整数的列表,有10个!可能的订单或排列.为什么random.shuffle仅在5000次尝试后会给出重复项?

>>> L = range(10)
>>> rL = list()
>>> for i in range(5000):
...     random.shuffle(L)
...     rL.append(L[:])
... 
>>> rL = [tuple(e) for e in rL]
>>> len(set(rL))
4997
>>> for i,t in enumerate(rL):
...     if rL.count(t) > 1:
...         print i,t
... 
102 (7, 5, 2, 4, 0, 6, 9, 3, 1, 8)
258 (1, 4, 0, 2, 7, 3, 5, 9, 6, 8)
892 (1, 4, 0, 2, 7, 3, 5, 9, 6, 8)
2878 (7, 5, …
Run Code Online (Sandbox Code Playgroud)

python random probability birthday-paradox

4
推荐指数
2
解决办法
483
查看次数

Python中无法捕获的异常

问题出现在这个问题中,我将在这段代码中重述:

import csv
FH = open('data.csv','wb')
line1 = [97,44,98,44,99,10]
line2 = [100,44,101,44,102,10]
for n in line1 + line2:
    FH.write(chr(n))
FH.write(chr(0))
FH.close()

import _csv

FH = open('data.csv')
reader = csv.reader(FH)
for line in reader:
    if '\0' in line:  continue
    if not line:  continue
    try:
        print line
    except _csv.Error:
        print 'error'
Run Code Online (Sandbox Code Playgroud)

运行:

$ python test.py 
['a', 'b', 'c']
['d', 'e', 'f']
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    for line in reader:
_csv.Error: line contains NULL …
Run Code Online (Sandbox Code Playgroud)

python exception

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

矢量化是不确定的

我试图在numpy中呈现一个简单的函数并获得不一致的行为.我希望我的代码在值<0.5时返回0,否则返回未更改的值.奇怪的是,命令行中不同的脚本运行会产生不同的结果:有时它可以正常工作,有时我会得到全0.当d <= T时,我使用三条线中的哪一条并不重要.它似乎与返回的第一个值是否为0有关.任何想法?谢谢.

import numpy as np

def my_func(d, T=0.5):
    if d > T:   return d
    #if d <= T:  return 0
    else:  return 0
    #return 0

N = 4
A = np.random.uniform(size=N**2)
A.shape = (N,N)
print A
f = np.vectorize(my_func)
print f(A)

$ python x.py
[[ 0.86913815  0.96833127  0.54539153  0.46184594]
 [ 0.46550903  0.24645558  0.26988519  0.0959257 ]
 [ 0.73356391  0.69363161  0.57222389  0.98214089]
 [ 0.15789303  0.06803493  0.01601389  0.04735725]]
[[ 0.86913815  0.96833127  0.54539153  0.        ]
 [ 0.          0.          0.          0.        ]
 [ …
Run Code Online (Sandbox Code Playgroud)

python numpy

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

哪个扫描用于从字符串中读取浮点数?

这似乎几乎是正确的,但它在换行线上窒息.最好的方法是什么?

package main

import (
    "fmt"
    "strings"
)

func main() {
    var z float64
    var a []float64
    // \n gives an error for Fscanf
    s := "3.25 -12.6 33.7 \n 3.47"
    in := strings.NewReader(s)
    for {
        n, err := fmt.Fscanf(in, "%f", &z)
        fmt.Println("n", n)
        if err != nil {
            break
        }
        a = append(a, z)
    }
    fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)

输出:

n 1
n 1
n 1
n 0
[3.25 -12.6 33.7]
Run Code Online (Sandbox Code Playgroud)

更新:

请参阅下面@Atom的答案.我找到了另一种方法,如果错误是EOF就会中断,否则只是忽略它.我知道,这只是一个黑客,但我控制着源头.

    _, err := fmt.Fscanf(in, "%f", &z)
    if err …
Run Code Online (Sandbox Code Playgroud)

go

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