- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个递归Python函数,它从包含代表一周中不同日期的不同“类型”元素的输入数组生成有效的输出数组,例如, [m1、m2、m3、m4、t1、t2、t3、t4、w1、w2、w3、w4]
。
为了满足我的需求,我能够找出一个递归函数(来自另一个堆栈溢出程序的帮助),它可以接受输入数组并根据约束返回有效数组:
输入示例
[m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,t1,t2,t3,t4,w1,w2,w3,w4,f1,f2 ,f3,f4]
。
示例输出:
[m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12]
(可以是所有一种类型,因为其他类型不存在)
[m5,m6,m7,m8,m9,m10,m11,m12,t1,t2,t3,t4]
(或按顺序每种类型至少 4 个)
[m4,m5,m6,m7,w1,w2,w3,w4,f1,f2,f3,f4]
(每种类型至少有 4 个,如果存在,但可以缺失)等等
无效:
[m4,m6,m5,m7,w1,w2,w3,w4,f1,f2,f3,f4]
(乱序)
[m4,m5,m6,m7,m8,w1,w2,w3,w4,f1,f2,f3]
(不是每种类型 4 个)
有效的代码:
import collections
import re
data = ['f13', 'f14', 'f15', 'f16', 'f17', 'w0', 'w1', 'w2', 'w3', 't4', 't5', 't6', 't7', 't8', 't9', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'm0', 'm1', 'm2', 'm3']
def combo(d, c = []):
if len(c) == 12:
yield c
else:
for i in d:
_count1 = collections.Counter([re.findall('^[a-zA-Z]+', j)[0] for j in c])
_count2 = collections.Counter([re.findall('^[a-zA-Z]+', j)[0] for j in c+[i]])
if i not in c:
if len(c) < 11 or all(b >= 4 for b in _count2.values()):
if re.findall('^[a-zA-Z]+', i)[0] in _count1:
if int(re.findall('\d+$', i)[0])-1 == int(re.findall('\d+$', c[-1])[0]) and re.findall('^[a-zA-Z]+', i)[0] == re.findall('^[a-zA-Z]+', c[-1])[0]:
yield from combo(d, c+[i])
else:
yield from combo(d, c+[i])
result = combo(data)
print(next(result))
输出
['f13','f14','f15','f16','w0','w1','w2','w3','t4','t5','t6','t7']
此函数成功返回正确/有效的计划,但要获得第一个成功结果,需要 299 秒。有没有办法优化代码,或者以某种方式处理输入数组,以便可以更快地返回这些结果?谢谢
编辑以澄清:
我需要一个函数(就像我现在拥有的那样)为输入生成所有可能的输出,该输出根据我所拥有的约束是有效的,最好以类似于生成器的方式,这样我可以在需要时一次循环一个,看看该组合是否适用于我的程序。
例如,使用相同的输入,
data = ['f13', 'f14', 'f15', 'f16', 'f17', 'w0', 'w1', 'w2', 'w3', 't4', 't5', 't6', 't7', 't8', 't9', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'm0', 'm1', 'm2', 'm3']
我可以得到类似的输出
['f13','f14','f15','f16','w0','w1','w2','w3','t4','t5','t6','t7']
['f14','f15','f16','f17','w0','w1','w2','w3','t4','t5','t6','t7']
['f13','f14','f15','f16','r4','r5','r6','r7','t4','t5','t6','t7']
等等
使用不同的输入
data = ['m0','m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8','m9','m10','m11','t0','t1', 't2', 't3', 't4', 't5']
我可以得到类似的输出
['m0','m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8','m9','m10','m11']
['m0','m1', 'm2', 'm3', 'm4', 'm5', 't0','t1', 't2', 't3', 't4','t5']
['m0','m1', 'm2', 'm3', 'm4', 'm5', 'm6','t1', 't2', 't3', 't4','t5']
等等
注意:根据我的需要,以下输出是等效的,但不一定只能打印其中之一
['m0','m1', 'm2', 'm3', 'm4', 'm5', 't0','t1', 't2', 't3', 't4','t5']
[ 't0','t1', 't2', 't3', 't4', 't5', 'm0','m1', 'm2', 'm3', 'm4', 'm5']
最佳答案
你可以试试这个代码。我对数据进行预处理(从字符串中生成数字并对它们进行排序),以便在每次迭代中不执行正则表达式:
import re
from itertools import groupby
from itertools import combinations
data = ['m0','m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8','m9','m10','m11','t0','t1', 't2', 't3', 't4', 't5']
# returns eg.:
# {'f': [13, 14, 15, 16, 17], 'w': [0, 1, 2, 3], 't': [4, 5, 6, 7, 8, 9], 'r': [4, 5, 6, 7, 8, 9], 'm': [0, 1, 2, 3]}
def preprocess_data(data):
out = {}
for item in data:
for k, v in re.findall(r'(\w)(\d+)', item):
out.setdefault(k, []).append(int(v))
for k in out:
out[k].sort()
return out
# 1. if an element from a specific day is present, there must be atleast 4 of them
# 2. the elements from a certain day must be sequential <- they are, because we preprocessed the data
# 3. must be 12 total elements
def check(data):
rv = {}
keys = set()
for k, v in data.items():
for vv, gg in groupby(enumerate(v), lambda k: k[0]-k[1]):
consecutive_elements = [ii[1] for ii in gg]
keys.add(k)
for i in range(4, len(consecutive_elements) + 1):
rv.setdefault(k, []).append(consecutive_elements[:i])
break
for k in [*rv.keys()]:
rv[k].append([])
for c in combinations([(k, i) for k, v in rv.items() for i in v], len(rv)):
if any(len(i[1]) < 4 for i in c if len(i[1]) > 0):
continue
elements = [i[0] for i in c]
if len(elements) != len(set(elements)):
continue
c2 = tuple(i[0] + str(ii) for i in c for ii in i[1])
if len(c2) == 12:
yield c2
def get_valid_combinations(data, dont_rotate=[], seen=set()):
for c in check(data):
if c not in seen:
seen.add(c)
yield c
for k, v in data.items():
if k in dont_rotate:
continue
for n in range(len(v)):
data[k] = v[n:] + v[:n]
yield from get_valid_combinations(data, dont_rotate + [k], seen)
for a in get_valid_combinations(preprocess_data(data)):
print(a)
打印:
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 't0', 't1', 't2', 't3', 't4', 't5')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 't0', 't1', 't2', 't3', 't4')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 't0', 't1', 't2', 't3')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 't1', 't2', 't3', 't4', 't5')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 't1', 't2', 't3', 't4')
('m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 't2', 't3', 't4', 't5')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 't0', 't1', 't2', 't3', 't4')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 't0', 't1', 't2', 't3')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 't0', 't1', 't2', 't3', 't4', 't5')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 't1', 't2', 't3', 't4', 't5')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 't1', 't2', 't3', 't4')
('m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 't2', 't3', 't4', 't5')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 't0', 't1', 't2', 't3')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 't0', 't1', 't2', 't3', 't4')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 't0', 't1', 't2', 't3', 't4', 't5')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 't1', 't2', 't3', 't4', 't5')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 't1', 't2', 't3', 't4')
('m2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 't2', 't3', 't4', 't5')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 't0', 't1', 't2', 't3')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 't0', 't1', 't2', 't3', 't4')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 't0', 't1', 't2', 't3', 't4', 't5')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 't1', 't2', 't3', 't4', 't5')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 't1', 't2', 't3', 't4')
('m3', 'm4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 't2', 't3', 't4', 't5')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11', 't2', 't3', 't4', 't5')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11', 't0', 't1', 't2', 't3')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 't0', 't1', 't2', 't3', 't4')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 't0', 't1', 't2', 't3', 't4', 't5')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 't1', 't2', 't3', 't4', 't5')
('m4', 'm5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11', 't1', 't2', 't3', 't4')
('m5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11', 't1', 't2', 't3', 't4', 't5')
('m5', 'm6', 'm7', 'm8', 'm9', 'm10', 'm11', 't0', 't1', 't2', 't3', 't4')
('m5', 'm6', 'm7', 'm8', 'm9', 'm10', 't0', 't1', 't2', 't3', 't4', 't5')
('m6', 'm7', 'm8', 'm9', 'm10', 'm11', 't0', 't1', 't2', 't3', 't4', 't5')
关于python - 优化递归代码以从输入数组生成有效数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57102733/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!