是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:
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)
这是最好的型号吗?我忽略了什么吗?任何问题?
我有一个简单的情节,有几组连接每组的点和线.我希望将点绘制在线的顶部(以便该线不显示在该点内).无论电话plot和scatter电话的顺序如何,这个情节都是一样的,而不是我想要的.有一个简单的方法吗?
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) 在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'不起作用.你能指点我一个工作的例子或解释我做错了什么.谢谢.
在模块中使用的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) 这是一个关于使用标准库的快速代码的相对优点的问题,但是对于手动的替代方案而言是模糊的(至少对我而言).在这个线程(以及它复制的其他线程)中,似乎将列表分成组的"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有独特的"副本",如果这是正确的单词,对于小整数.例如:
>>> 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 代码(空格很重要)发布到 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>标签与空白混淆。我想我可以只添加 *4 ---但这是不赞成的或者 HTML 风格的上帝。
对此的标准答案(就像在 SO 上一样)是通过使用 css(我不太了解)来获得语法着色或突出显示,例如在上一个 SO question here 中讨论的那样。我遇到的问题是所有这些解决方案都需要从 Web 上的服务器加载资源。但是,如果(例如 5 年后)该资源消失了,则代码的 html 版本将根本无法呈现。如果我知道 Javascript,我想我可能会解决这个问题。
着色问题本身是微不足道的,可以通过使用<style>具有各种定义的标签来解决。但是解析很困难;至少我在尝试自己解析 Python 方面没有取得太大进展。多行字符串是一种特殊的痛苦。我可以忽略困难的情况并编写简单的情况。
TextMate 有一个命令Create HTML from Document。结果相当冗长,但可以粘贴到帖子中。但是如果你有 3 个代码段,那么它就像 1000 行或其他东西。当然,它是一个文档,因此您必须在粘贴之前进行实际剪切。
有没有简单的 Python 解析器?更好的解决方案?
更新:我编写了自己的语法高亮解析器。也许仍然有点问题,但它非常简单且是一个独立的解决方案。我把它贴在这里。Pygments 也是一个不错的选择。
bbum 发布了如何执行此操作的大纲,但我无法完成详细信息.Python代码在哪里,我的Objective-C代码将如何知道它?我如何在命令行上进行编译?
对于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) 问题出现在这个问题中,我将在这段代码中重述:
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) 我试图在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) 这似乎几乎是正确的,但它在换行线上窒息.最好的方法是什么?
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) python ×10
computation ×1
css ×1
cython ×1
exception ×1
flatten ×1
go ×1
html ×1
largenumber ×1
list ×1
matplotlib ×1
memory ×1
numpy ×1
objective-c ×1
optimization ×1
probability ×1
random ×1