我似乎尽管有大量的算法和函数用于从唯一项目列表中生成任何大小的唯一组合,但是在非唯一项目列表(即包含重复项的列表)中没有可用的相同的价值.)
问题是如何在生成器函数中生成ON-THE-FLY所有来自非唯一列表的独特组合,而不需要过滤重复计算的昂贵计算?
现在,由于对这个问题有一个很有动力的答案,因此更容易提供我期望实现的目标:
首先,让我们提供一些代码,说明如何检查组合comboB是否与另一个组合重复(comboA):
comboA = [1,2,2]
comboB = [2,1,2]
print("B is a duplicate of A:", comboA.sort()==comboB.sort())
Run Code Online (Sandbox Code Playgroud)
在给定的例子中,B是A的副本,print()打印为True.
在这里解决了获取能够在非唯一列表的情况下即时提供独特组合的生成器功能的问题:从非唯一项目列表中获取独特的组合,更快?,但是提供的生成器函数需要查找并且需要内存,以便在大量组合的情况下导致问题.
在当前版本的答案提供功能完成工作没有任何查找,似乎是正确的答案,但......
摆脱查找的目的是在列表重复的情况下加速生成唯一组合.
我最初(编写这个问题的第一个版本)错误地认为,不需要创建用于确保唯一性所需的查找集的代码预期会比需要查找的代码具有优势.事实并非如此.至少并非总是如此.截至目前提供的答案中的代码不使用查找,但是如果没有冗余列表或者列表中只有少量冗余项,则需要花费更多时间来生成所有组合.
这里有一些时间来说明目前的情况:
-----------------
k: 6 len(ls): 48
Combos Used Code Time
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.036 seconds
12271512 len(list(subbags(ls,k))) : 50.540 seconds
12271512 len(list(uniqueCombinations(ls,k))) : 8.174 seconds
12271512 len(set(combinations(sorted(ls),k))): 7.233 seconds
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.030 seconds
1 len(list(subbags(ls,k))) : 0.001 seconds
1 len(list(uniqueCombinations(ls,k))) : 3.619 seconds …Run Code Online (Sandbox Code Playgroud) 我刚开始尝试在C中编写我的第一个Python扩展模块,并使用https://www.tutorialspoint.com/python/python_further_extensions.htm中提供的说明.
我在Linux Mint 18.1上,在其virtualenv版本中使用Python 3.6.1.
作为第一步,我编写了一个非常简约的Python模块版本.
这是我的C代码:
include <Python.h>
static PyObject* uniqueCombinations(PyObject* self)
{
return Py_BuildValue("s", "uniqueCombinations() return value (is of type 'string')");
}
static char uniqueCombinations_docs[] =
"usage: uniqueCombinations(lstSortableItems, comboSize)\n";
static PyMethodDef uniqueCombinations_funcs[] = {
{"uniqueCombinations", (PyCFunction)uniqueCombinations,
METH_NOARGS, uniqueCombinations_docs},
{NULL}
};
void inituniqueCombinations(void)
{
Py_InitModule3("uniqueCombinations", uniqueCombinations_funcs,
"Extension module uniqueCombinations v. 0.01");
}
Run Code Online (Sandbox Code Playgroud)
这里是我用来编译C代码的setup.py文件的代码 uniqueCombinations.cpython-36m-x86_64-linux-gnu.so:
from distutils.core import setup, Extension
setup(name='uniqueCombinations', version='0.01', \
ext_modules=[Extension('uniqueCombinations', ['uniqueCombinations_pythonCmodule_v-0.01_Cg.c'])])
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,导入时模块无法正确加载:
>>> import uniqueCombinations
Traceback (most recent call last):
File "<stdin>", line …Run Code Online (Sandbox Code Playgroud) 这是一个提供便利功能的问题的更新版本
pd_read_printed(str_printed_df)
旨在从之前使用print(some_pandas_DataFrame)编写的字符串中创建一个pandas DataFrame:
Run Code Online (Sandbox Code Playgroud)def pd_read_printed(str_printed_df): global pd, StringIO try: x = pd except: import pandas as pd try: x = StringIO except: from pandas.compat import StringIO return pd.read_csv(StringIO(str_printed_df), delim_whitespace=True)
在我得到以下问题的答案之后,我把它放在一起供自己使用:
我在互联网上经常看到pandas DataFrame在其印刷版中的内容,例如::
df1_as_string = """
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
"""
Run Code Online (Sandbox Code Playgroud)
问题是:如何从类似以下样式的字符串变量中获取保存DataFrame的变量:
df1 = pandas.someToMeUnknownPandasFunction(df1_as_string)
Run Code Online (Sandbox Code Playgroud)
?
现在让我们使用提供的函数从df1_as_string以下位置创建DataFrame :
df1 = pd_read_printed(df1_as_string)
Run Code Online (Sandbox Code Playgroud)
并检查它是否按预期工作:
print(df1) …Run Code Online (Sandbox Code Playgroud) L我想在以下代码中翻转循环:
L = [1,2,5,2,1,1,3,4]
L_unique = []
for item in L:
if item not in L_unique:
L_unique.append(item)
Run Code Online (Sandbox Code Playgroud)
列表理解如下:
L_unique = [ item for item in L if item not in ???self??? ]
Run Code Online (Sandbox Code Playgroud)
这在Python中可能吗?如果可能的话,怎样才能做到呢?
以下代码运行时不会出现断言错误:
\nK = \'K\'\n = \'\'\n = \'\'\n = \'\'\n = \'\'\n = \'\'\n\xe1\xb4\xb7 = \'\xe1\xb4\xb7\'\nassert K == == == == == \xe1\xb4\xb7\nprint(f\'{K=}, {=}, {=}, {=}, {=}, {=}\')\nRun Code Online (Sandbox Code Playgroud)\n和打印
\nK=\'\xe1\xb4\xb7\', =\'\xe1\xb4\xb7\', =\'\', =\'\xe1\xb4\xb7\', =\'\xe1\xb4\xb7\', =\'\xe1\xb4\xb7\'\nRun Code Online (Sandbox Code Playgroud)\n我知道https://peps.python.org/pep-3131/并阅读了有关标识符的 Python 文档https://docs.python.org/3/reference/lexical_analysis.html#identifiers \nbut Haven\'没有找到任何解释所经历的行为的提示。
\n所以我的问题是:如果将新值分配给其中一个,所有其他光学明显不同的标识符的值不会改变,我的期望有什么问题?
\n更新:考虑到当前可用的评论和答案,需要更多地解释我所期望的问题的令人满意的答案:
\n关于标识符名称比较背后的 NFKC 转换的提示有助于理解经验行为是如何存在的,但是……这让我仍然有一个问题:选择不同方法背后的深层原因是什么?根据它们出现的上下文来比较 Unicode 字符串?
\n作为字符串文字的字符串相互比较的方式显然不同于相同字符串指定标识符名称时的比较方式。
\n为了能够了解为什么决定在 Python 中表示标识符名称的 Unicode 字符串不以与表示字符串文字的 Unicode 字符串相同的方式进行相互比较,我还想知道什么?
\n如果我理解正确的话,Unicode 可能会使用表示复杂字符的一个代码点或具有适当基本字符及其修饰符的多个代码点来对相同的预期结果产生不明确的规范。Unicode 字符串的规范化是解决由于首先引入这种歧义的可能性而造成的混乱的一种尝试。但在我看来,这是对 Unicode 可视化工具(如查看器和编辑器)影响最大的 Unicode 特定内容。使用字符串表示为大于 255 的整数值(Unicode 代码点)列表的编程语言实际实现的是另一回事,不是吗?
\n …更新(镜像最先进的知识水平)状态:2017-05-12
这次更新的原因是,在我提出这个问题的时候,我并不知道我发现了一些关于Python3如何在"引擎盖下"工作的东西.
以下所有内容的结论是:
如果为迭代器编写自己的Python3代码并关心执行速度,则应将其编写为生成器函数而不是迭代器类.
下面是一个简约的代码示例,演示了表示为生成器函数的相同算法(此处:自制的Pythons版本range())运行速度比表示为迭代器类的速度快得多:
def gnrtYieldRange(startWith, endAt, step=1):
while startWith <= endAt:
yield startWith
startWith += step
class iterClassRange:
def __init__(self, startWith, endAt, step=1):
self.startWith = startWith - 1
self.endAt = endAt
self.step = step
def __iter__(self):
return self
def __next__(self):
self.startWith += self.step
if self.startWith <= self.endAt:
return self.startWith
else:
raise StopIteration
N = 10000000
print(" Size of created list N = {} elements (ints 1 to N)".format(N))
from time import time …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 tkinter 和 tcl 8.6 版本的 Python 3.9,因此根据2010 年 stackoverflow 上的答案,我应该能够绘制旋转文本。实际上我可以在 tkinter 中绘制旋转文本,因此我尝试使用海龟模块创建旋转文本:
import turtle
txt = ' '
tt = turtle.Turtle()
tt.write(txt, angle=-45)
Run Code Online (Sandbox Code Playgroud)
但收到错误消息:TypeError: write() got an unexpected keyword argument 'angle'这意味着海龟模块尚不支持文本旋转功能。
这就提出了一个问题:是否有人知道一个补丁/修复程序可以使turtle模块利用Python 3自3.7.2版本以来提供的文本旋转功能?
我目前正在使用SciTE作为文本和代码编辑器,并且可以通过在“ .SciTEUser.properties”文件中指定来调整插入符号的闪烁速度
caret.period=350
Run Code Online (Sandbox Code Playgroud)
现在,我正在评估Sublime Text 3的功能(如果确实重要,我将使用Linux Mint 18.1),并且找不到在此处更改插入符号闪烁率的方法。
我发现有关在Sublime Text 3中设置插入符号属性的所有内容是:
// Valid values are "smooth", "phase", "blink" and "solid".
"caret_style": "phase",
"caret_extra_top": 1,
"caret_extra_bottom": 1,
"caret_extra_width": 7,
Run Code Online (Sandbox Code Playgroud)
但找不到类似caret_blinking_rateor caret_frequency或or的东西caret_period。
如何在Sublime Text 3中更改插入符号的闪烁速率/速度?
我需要一个解决方案,从非唯一列表中提取唯一元素,并计算其重复元素.
该解决方案的目的是在算法中使用它来从非唯一列表创建唯一组合.在这种情况下创建组合的列表大小通常非常小(少于50个元素),但我的目标是找到尝试随时随地优化的最快代码(即使只获得非常少量的运行时间) ).
Pythons collections模块提供了一个适合专业的目的collections.Counter,但有些情况下,使用简单的字典而不是collections.Counter导致更快的代码,就像你可以使用下面的代码检查自己:
from time import time as t
from timeit import timeit as tt
from collections import Counter
def counter(iterable):
dctCounter = {}
for item in iterable:
if item in dctCounter:
dctCounter[item] += 1
else:
dctCounter[item] = 1
return dctCounter
for n, N in [(1,10), (10,1), (1,50), (50,1), (1,100), (100,1), (1,200), (200, 1), (1, 500), (500, 1), (1, 1000), (1000,1)]:
lstItems = n*list(range(N))
for noLoops in [10**p for p in range(5, 6)]: …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,需要从屏幕的特定区域截取 30x40 像素的屏幕截图。这并不难做到,因为有很多方法可以做到这一点。
我遇到的问题是,我需要每秒拍摄大约 10 到 15 张我提到的尺寸的屏幕截图。当我查看其中一些捕获屏幕的方法时,我发现当您为它们提供较小选择的参数时,就会涉及到裁剪。因此,正在拍摄完整的屏幕截图,然后该方法将其裁剪为给定的大小。如果我只使用 30x40 图像,这似乎是一种资源浪费,特别是考虑到我将拍摄数千张屏幕截图。
所以我的问题是:是否有一种方法只能捕获屏幕的一部分,而不捕获整个屏幕,从大屏幕截图中剪切出所需的部分?我目前正在使用这个命令:
im = pyautogui.screenshot(region=(0,0, 30, 40))。
从 Python 版本 3.10 开始,内置函数zip()允许使用带有默认值的参数,该strict默认值False提供设置选项,以防迭代不具有相等的长度(有助于调试)。strict=TrueTypeError
list=False管道中是否还有一个选项,如果设置为list=True返回列表列表而不是元组列表?如果没有:有充分的理由不这样做吗?
来自评论:
听起来像你想要的
map(list, zip(...))-凯尔伍德
这将是压缩项目整个长度的两倍,并且用 Python 编写的自己的 zip() 会减慢速度。另一种选择也[list(e) for e in zip(...)]有同样的缺点。我想要的是 zip 的 list=True 选项,想知道为什么它不存在?可能有一个我不知道的充分理由。首先打包元组,然后将其重新打包到列表中没有多大意义。元组比列表受到更多限制,减少了对结果可能的直接操作的数量。在我看来,更多的 Pythonic 是返回一个列表列表,这提供了更大的灵活性 - 这就是我想知道并提出这个问题的原因。
通常,您使用 zip 来迭代对,例如 zip(...) 中的 x, y
是的,但是 zip() 的另一个用途是转置列表数组的二维列表(例如在numpywith中提供.T),并希望结果是列表列表而不是元组列表,以便能够对数组元素进行操作。
python-3.x ×9
python ×7
c++ ×2
performance ×2
combinations ×1
counter ×1
csv ×1
dictionary ×1
generator ×1
image ×1
iterator ×1
linux-mint ×1
lookup ×1
pandas ×1
screenshot ×1
string ×1
sublimetext3 ×1
unicode ×1
unique ×1
yield ×1