我在Python列表中有一个未排序的整数列表.我想在完整列表的子集中排序元素,而不是完整列表本身.我还希望对列表进行排序,以便不创建新列表(我经常这样做).我最初尝试过
p[i:j].sort()
Run Code Online (Sandbox Code Playgroud)
但这并没有改变p的内容,大概是因为新的列表形成,排序,然后扔掉而不影响原始列表的内容.当然,我可以创建自己的排序函数并使用循环来选择适当的元素,但这不会感觉到pythonic.是否有更好的方法对子列表进行排序?
我想生成一个方位角高程图,描绘一个身体在一系列日期的运动.在下面的示例图中,我使用标准matplotlib调用绘制了数据的极坐标图.但是,我想以编程方式将tic标记和文本标签添加到某些点,以注释与数据关联的日期.使用Gimp将这些添加到下图中.
理想情况下,我希望将tic标记绘制为绘制它们的曲线位置的正常标记,但如果我可以将它们与现有的matplotlib函数调用一起使用,我可以将它们放在垂直或水平位置.但是,我无法找到一组执行此操作的函数.是否有这样的事情或我需要自己编写?
from matplotlib.pyplot import *
azel = [(0.13464431952125472,294.0475121469728,41761.31282856121),
(1.0847050101323694, 294.07215546949817, 41762.31339111264),
(2.0568066678342625, 294.08166309282285, 41763.3139526239),
(3.0241776724839813, 294.07688196040385, 41764.3145128838),
(3.9693016837899107, 294.05876829872494, 41765.315071676574),
(4.880729810599228, 294.0283602965401, 41766.315628782446),
(5.750685455655052, 293.98677810487305, 41767.31618397785),
(6.573500415719916, 293.93516919550444, 41768.316737037436),
(7.344961744736395, 293.8748176439982, 41769.31728773474),
(8.061838763227069, 293.80692556364824, 41770.317835842376),
(8.7216239379929, 293.732913633802, 41771.31838113272),
(9.322354443421153, 293.65412057153674, 41772.31892337514),
(9.862485802985763, 293.57204901846984, 41773.319462333326),
(10.340798827919878, 293.48820161621876, 41774.31999776034),
(10.756318508719481, 293.40413564791425, 41775.32052939467),
(11.108256812309081, 293.3215176797138, 41776.32105695697),
(11.395961455622944, 293.2420689192882, 41777.321580147836),
(11.618873216922772, 293.16759253657835, 41778.32209864656),
(11.776501176361972, 293.09997366379525, 41779.322612110234),
(11.868395395228971, 293.04117939541976, 41780.32312017416),
(11.894134963116164, 292.9932041466896, 41781.32362245329),
(11.853317752636167, 292.95820625738247, 41782.324118542434),
(11.745559565648168, 292.9383167465194, 41783.32460801967),
(11.57050010967345, 292.9358305576615, 41784.325090448285),
(11.327811535631849, 292.95306995512664, …
Run Code Online (Sandbox Code Playgroud) 我有一个类使用递归的回溯算法解决一个确切的覆盖问题.最初,我使用在初始化期间传递给对象的回调函数实现了类.无论何时找到解决方案,都会调用此回调.在查看其他人对同一问题的实现时,我看到他们使用yield语句来传递解决方案,换句话说,他们的代码是一个python生成器.我认为这是一个有趣的想法,所以我创建了我的课程的新版本以使用收益率.然后,我在两个版本之间运行了比较测试,令我惊讶的是,我发现生成器版本运行速度比回调版本慢5倍.请注意,除了切换回调的yield之外,代码是相同的.
这里发生了什么?我猜测,因为生成器需要在屈服之前保存状态信息,然后在下次调用时重新启动时恢复该状态,正是这种保存/恢复使生成器版本运行得慢得多.如果是这种情况,发电机必须保存和恢复多少状态信息?
来自python专家的任何想法?
- 编辑7:40太平洋时间
这是使用yield的求解器代码.通过调用回调函数替换下面的第一个yield,并将第二个yield更改为以下循环,只需一个递归调用来解析此代码的原始版本.
def solve(self):
for tp in self.pieces:
if self.inuse[tp.name]: continue
self.inuse[tp.name] = True
while tp.next_orientation() is not None:
if tp.insert_piece():
self.n_trials += 1
self.pieces_in += 1
self.free_cells -= tp.size
if self.pieces_in == len(self.pieces) or self.free_cells == 0:
self.solutions += 1
self.haveSolution = True
yield True
self.haveSolution = False
else:
self.table.next_base_square()
for tf in self.solve():
yield tf
tp.remove_piece()
self.pieces_in -= 1
self.table.set_base_square(tp.base_square)
self.free_cells += tp.size
self.inuse[tp.name] = False
tp.reset_orientation()
Run Code Online (Sandbox Code Playgroud)
调用求解器的邮件循环(当然是在初始化之后)是
start_time = time.time()
for tf in …
Run Code Online (Sandbox Code Playgroud) 是否有一种有效的算法来计算最小整数N,使得N!可以被p ^ k整除,其中p是一个相对较小的素数,k是一个非常大的整数.换一种说法,
factorial(N) mod p^k == 0
Run Code Online (Sandbox Code Playgroud)
如果给定N和p,我想找到p分成N!的次数,我会使用众所周知的公式
k = Sum(floor(N/p^i) for i=1,2,...
Run Code Online (Sandbox Code Playgroud)
我已经对k的小值进行了强力搜索,但随着k的增加,这种方法很快就会崩溃,并且似乎没有一种模式可以推断为更大的值.
2011年6月13日编辑
使用Fiver和Hammar提出的建议,我使用准二分搜索来解决问题但不完全按照他们的建议.使用上面第二个公式的截断版本,我计算了N的上限作为k和p的乘积(仅使用第一项).我用1作为下限.使用经典二进制搜索算法,我计算了这两个值之间的中点,并计算了在第二个公式中使用此中点值作为N的k,这次使用了所有项.
如果计算的k太小,我调整下限并重复.太大了,我首先测试看中间点1计算的k是否小于期望的k.如果是这样,中点返回为最接近的N.否则,我调整了高点并重复.
如果计算的k相等,我测试了中点-1处的值是否等于中点处的值.如果是这样,我将高点调整为中点并重复.如果中点-1小于期望的k,则返回中点作为期望的答案.
即使k值非常大(10位或更多位),这种方法也可以使用O(n log(n))速度.
我正在极坐标图上绘制方位角高程曲线,其中高程是径向分量.默认情况下,Matplotlib将径向值从中心的0绘制到周长的90.我想扭转局面,因此90度处于中心位置.我尝试通过调用ax.set_ylim(90,0)设置限制,但这会导致抛出LinAlgError异常.ax是从调用add_axes获得的轴对象.
可以这样做,如果是这样,我该怎么办?
编辑:这是我现在正在使用的.基本绘图代码取自Matplotlib示例中的一个
# radar green, solid grid lines
rc('grid', color='#316931', linewidth=1, linestyle='-')
rc('xtick', labelsize=10)
rc('ytick', labelsize=10)
# force square figure and square axes looks better for polar, IMO
width, height = matplotlib.rcParams['figure.figsize']
size = min(width, height)
# make a square figure
fig = figure(figsize=(size, size))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], projection='polar', axisbg='#d5de9c')
# Adjust radius so it goes 90 at the center to 0 at the perimeter (doesn't work)
#ax.set_ylim(90, 0)
# Rotate plot so 0 degrees is …
Run Code Online (Sandbox Code Playgroud) 我有一个包含 1 和 0 的字符串。我想确定是否有至少连续重复 3 次的 1 个或多个字符的子字符串。例如,字符串 '000' 有一个长度为 1 的子字符串,由一个重复 3 次的单个零字符组成。字符串“010010010011”实际上有 3 个这样的子字符串,每个子字符串都重复 3 次(“010”、“001”和“100”)。
是否有正则表达式可以在不知道特定模式或模式长度的情况下找到这些重复模式?我不在乎模式是什么,也不在乎它的长度是多少,只关心字符串包含 3-peat 模式。
是否可以使用pyplot的triplot函数绘制由scipy.spatial.Delaunay生成的三角形列表,以便可以绘制每个三角形并用单独的颜色填充?我创建的基本python脚本是
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay
import matplotlib.image as mpimg
h = 300
w = 1000
npts = 30
pts = np.zeros((npts,2))
pts[:,0] = np.random.randint(0,w,npts)
pts[:,1] = np.random.randint(0,h,npts)
tri = Delaunay(pts)
plt.xlim(0, w)
plt.ylim(0, h)
# Determine the color used for each triangle based upon the orthocenter
# of the triangle and the corresponding pixel color in a background image.
centers = np.sum(pts[tri.simplices], axis=1, dtype='int')/3.0
colors = [img[y,x] for x,y in centers]
# …
Run Code Online (Sandbox Code Playgroud)