我有一个任意长度的列表,我需要将它分成相同大小的块并对其进行操作.有一些明显的方法可以做到这一点,比如保留一个计数器和两个列表,当第二个列表填满时,将它添加到第一个列表并清空下一轮数据的第二个列表,但这可能非常昂贵.
我想知道是否有人对任何长度的列表都有一个很好的解决方案,例如使用生成器.
我一直在寻找有用的东西,itertools但我找不到任何明显有用的东西.但是可能会错过它.
我有一个Python脚本,它将整数列表作为输入,我需要一次使用四个整数.不幸的是,我无法控制输入,或者我将它作为四元素元组列表传入.目前,我正在以这种方式迭代它:
for i in xrange(0, len(ints), 4):
# dummy op for example code
foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3]
Run Code Online (Sandbox Code Playgroud)
它看起来很像"C-think",这让我怀疑有更多的pythonic方式来处理这种情况.迭代后会丢弃该列表,因此无需保留.也许这样的事情会更好吗?
while ints:
foo += ints[0] * ints[1] + ints[2] * ints[3]
ints[0:4] = []
Run Code Online (Sandbox Code Playgroud)
但是,仍然没有"感觉"正确.: - /
Python中"iterable","iterator"和"iteration"的最基本定义是什么?
我已阅读多个定义,但我无法确定其确切含义,因为它仍然不会沉入其中.
有人可以帮助我解释外行人的3个定义吗?
我正在寻找一个可迭代i和大小的函数,n并产生长度n为连续值的元组i:
x = [1,2,3,4,5,6,7,8,9,0]
[z for z in TheFunc(x,3)]
Run Code Online (Sandbox Code Playgroud)
给
[(1,2,3),(4,5,6),(7,8,9),(0)]
Run Code Online (Sandbox Code Playgroud)
标准库中是否存在这样的功能?
如果它作为标准库的一部分存在,我似乎无法找到它并且我已经没有用于搜索的术语.我可以自己写,但我宁愿不写.
我理解使用subprocess是调用外部命令的首选方式.
但是如果我想在parall中运行几个命令,但是限制生成的进程数呢?困扰我的是我无法阻止子进程.例如,如果我打电话
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile)
Run Code Online (Sandbox Code Playgroud)
然后该过程将继续,无需等待cmd完成.因此,我无法将其包装在multiprocessing图书馆的工作人员中.
例如,如果我这样做:
def worker(cmd):
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile);
pool = Pool( processes = 10 );
results =[pool.apply_async(worker, [cmd]) for cmd in cmd_list];
ans = [res.get() for res in results];
Run Code Online (Sandbox Code Playgroud)
然后每个工人将在产生子流程后完成并返回.所以我无法真正限制subprocess使用生成的进程数Pool.
什么是限制子过程数量的正确方法?
如果您在Python 3.7中有一个列表:
>>> li
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
您可以n使用两种常见的Python习语之一将其转换为每个长度的块列表:
>>> n=3
>>> list(zip(*[iter(li)]*n))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
Run Code Online (Sandbox Code Playgroud)
因为(9,10)不是长度,所以丢弃最后一个不完整的元组n
你也可以这样做:
>>> [li[i:i+n] for i in range(0,len(li),n)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
Run Code Online (Sandbox Code Playgroud)
如果你想要最后一个子列表,即使它有少于n元素.
假设我现在有一个发电机,gen未知长度或终端(所以呼叫list(gen))或sum(1 for _ in gen)不明智)我想要每个块.
我能够想出的最好的生成器表达式是这样的:
from itertools import zip_longest
sentinel=object() # for use in filtering out ending …Run Code Online (Sandbox Code Playgroud) 给出一个清单
A = [1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)
是否有任何惯用(Pythonic)方式迭代它就好像它一样
B = [(1, 2) (3, 4) (5, 6)]
Run Code Online (Sandbox Code Playgroud)
索引除外?感觉就像C的延续:
for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]:
Run Code Online (Sandbox Code Playgroud)
我不禁觉得应该有一些聪明的黑客使用itertools或切片或其他东西.
(当然,一次两个只是一个例子;我想要一个适用于任何n的解决方案.)
编辑:在Python中一次迭代字符串2(或n)个字符,但即使是最干净的解决方案(使用zip接受)也不能很好地推广到更高的n而没有列表理解和*-notation.
如果我有一个清单:
["A","Bb","C","D","E","F","G"]
Run Code Online (Sandbox Code Playgroud)
我如何迭代它以便输出以下内容:
"A Bb C"
"D E F"
"G"
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种比较列表中两个相邻项目的方法,例如.比较哪个值更高,然后我会相应地对它们进行排序.这是一个用户将要输入的列表,所以它不是公正的情况
if l[1] > l[2],因为我不知道列表的长度,所以我需要一个通用语句用于for循环.
我有想法有类似
for i in l:
if x > i[index of x + 1]
但不知道如何找到变量的索引.感谢任何帮助,谢谢
编辑:我知道内置的排序功能,但只是想通过创建自己的:)来练习编码和算法编写
我有一个非常简单的Python脚本来创建(用于测试目的),列表中有3500万个字典对象.每个字典对象包含两个键/值对.例如.
{'Name': 'Jordan', 'Age': 35}
Run Code Online (Sandbox Code Playgroud)
该脚本非常简单地对名称和年龄进行查询,搜索字典列表并返回包含所有匹配字典条目索引的新列表.
但是,如下所示,消耗了大量内存.我认为我在某个地方犯了一个非常天真的错误.

我的代码如下:(如果更具可读性,也可以在图像中查看).
import sys
# Firstly, we will create 35 million records in memory, all will be the same apart from one
def search(key, value, data, age):
print("Searching, please wait")
# Create list to store returned PKs
foundPKS = []
for index in range(0, len(data)):
if key in data[index] and 'Age' in data[index]:
if data[index][key] == value and data[index]['Age'] >= age:
foundPKS.append(index)
results = foundPKS
return results
def createdata():
# Let's create …Run Code Online (Sandbox Code Playgroud) 可能重复:
在Python中用块(n)迭代迭代器?
假设我有一个492个字符的字符串存储在一个变量中.如何打印前50个字符,然后转到下一行,然后打印出下一个50,最后打印一个包含42个字符的行?
python ×11
list ×3
chunks ×2
generator ×2
iteration ×2
optimization ×2
python-3.x ×2
dictionary ×1
iterable ×1
iterator ×1
loops ×1
memory ×1
python-2.7 ×1
split ×1
std ×1
string ×1
subprocess ×1
terminology ×1