我正在为一个软件编写脚本,它并没有真正让我直接访问我需要的数据.相反,我需要询问我需要的每一条信息,并建立一个我正在获得的数据列表.由于各种原因,我需要对列表进行排序.只需构建一次列表,然后对其进行排序,然后对其进行处理就很容易了.但是,我认为一次运行所有内容会更快,而不是构建列表然后对其进行排序.
所以,目前我基本上得到了这个:
my_list = []
for item in "query for stuff":
my_list.append("query for %s data" % item)
my_list.sort()
do_stuff(my_list)
Run Code Online (Sandbox Code Playgroud)
"查询东西"位是与软件的查询界面,这将给我一个可迭代的.my_list需要包含来自所述iterable内容的数据列表.通过这样做,我正在查询第一个列表,然后循环它以提取数据并将其放入my_list.然后我正在整理它.最后,我正在使用do_stuff()方法对其进行操作,该方法将遍历它并对每个项目执行操作.
问题是在排序之前我不能do_stuff(),因为列表顺序由于各种原因很重要.我不认为我可以摆脱两次循环列表 - 一次构建列表,一次对其中的每个项目做东西,因为我们事先不知道N位置最近添加的项目是否会在我们添加下一个项目之后保持在位置N - 但是以排序的方式插入每个项目似乎更干净,而不是仅仅在最后添加它们.有点像这样:
for item in "query for stuff":
my_list.append_sorted(item)
Run Code Online (Sandbox Code Playgroud)
是否值得尝试这样做,或者我应该坚持建立列表,然后对其进行排序?
谢谢!
基本上,我想使用.format(),如下所示:
my_string = '{{0}:{1}}'.format('hello', 'bonjour')
Run Code Online (Sandbox Code Playgroud)
并匹配:
my_string = '{hello:bonjour}' #this is a string with literal curly brackets
Run Code Online (Sandbox Code Playgroud)
但是,第一段代码给了我一个错误.
大括号很重要,因为我使用Python通过基于文本的命令与一个软件进行通信.我无法控制fosoftware所期望的格式,因此我最终整理出所有格式是至关重要的.它在字符串周围使用大括号来确保字符串中的空格被解释为单个字符串,而不是多个参数 - 就像通常使用文件路径中的引号一样.
我目前正在使用旧方法:
my_string = '{%s:%s}' % ('hello', 'bonjour')
Run Code Online (Sandbox Code Playgroud)
这当然有效,但.format()似乎更容易阅读,当我在一个字符串中发送包含五个或更多变量的命令时,可读性成为一个重要问题.
谢谢!
我有N个不同长度的列表.这些列表包含要在UI中显示的项目,并且我的最大UI预算为X.任何多余的项目都会进入下拉菜单.我需要做的是将列表中的项目移动到它们的"溢出"等效项中,以便所有列表的总长度等于或小于最大长度.我想确保没有列出的列表少于必要的列表,并且它们最终会尽可能接近相等的长度.例:
我有三个列表l1=range(10),l2=range(15)和,l3=range(20)和maxLength=40.我需要从中得到的是l1并l2保持原样并l3缩短为15项,因为10 + 15 + 15 = 45.如果l1=range(15)不是,我应该结束了两个清单13项和一个14.
目前,我有一个使用while循环来实现此功能的函数,如下所示:
def shortenLists(maxLength, *input_lists):
overflows = [[] for n in input_lists]
while sum(len(l) for l in input_lists) > maxLength:
longestList = max(input_lists, key=len)
index = input_lists.index(longestList)
overflows[index].append(longestList.pop())
[o.reverse() for o in overflows]
return input_lists, overflows
Run Code Online (Sandbox Code Playgroud)
这似乎基本上可行,但我不特别喜欢使用while循环这样的事情; 似乎要弄清楚要从每个列表中删除多少项目应该相对简单.此方法还依赖于使用list.index()方法查找输入中最长列表的索引,以便将项添加到正确的溢出缓冲区,这看起来有点像黑客.
该函数返回两个列表的元组,其中裁剪的输入列表按顺序排列,溢出缓冲区按相同的顺序排列.我不确定这是否是最好的方法,最好将它们压缩,以便它返回((列表,溢出),(列表,溢出)).
我正在编写一个相当大的文本文件(它实际上更像是 ascii 编码的数据),而且它......非常慢。并且占用大量内存。
这是我用来测试如何更快地写入文件的代码的简约版本。writeFileIncrementally在 for 循环中一次写入一行,同时writeFileFromBigData创建一个大字符串,然后将其转储到磁盘。我本以为writeFileFromBigData会更快,但结果快了 20 倍!这比我预期的要多一些。对于size=10_000_000,增量写入需要 20-25 秒,一次性写入需要 1-1.5 秒。另外,增量版本实际上会分配越来越多的内存。到最后,它已经进入 GiB 范围了。我不明白这是怎么回事。
func writeFileIncrementally(toUrl url: URL, size: Int) {
// ensure file exists and is empty
try? "".write(to: url, atomically: true, encoding: .ascii)
guard let handle = try? FileHandle(forWritingTo: url) else {return}
defer {
handle.closeFile()
}
for i in 0..<size {
let s = "\(i)\n"
handle.write(s.data(using: .ascii)!)
}
}
func writeFileFromBigData(toUrl url: URL, size: Int) {
let s …Run Code Online (Sandbox Code Playgroud)