我有三组数字,目标是从中找到尽可能多的形成算术序列的组。我知道一组对应于每个序列的第一个数字,依此类推。有了这些(缩短的)列表版本,找到序列的方法是什么?到目前为止,我唯一的想法是嵌套 for 循环,它适用于较小的列表,但对于完整的列表开始花费太长时间。
clist = [7, 11, 52, 102, 144, 314]
tlist = [10, 29, 79, 94, 121, 146]
flist = [13, 47, 184, 190, 544, 649]
预先感谢您的帮助
所以首先你想要空集,每组只有一个元素,每组只有两个元素,因为所有这些从技术上来说都可以说是一个算术级数:
series = [[]]
for j in range(len(clist)):
series.append([clist[j]])
series.append([tlist[j]])
series.append([flist[j]])
for k in range(len(clist)):
series.append([clist[j],tlist[k]])
series.append([clist[j],flist[k]])
series.append([flist[j],tlist[k]])
series.append([flist[j],clist[k]])
series.append([tlist[j],clist[k]])
series.append([tlist[j],flist[k]])
if j != k:
series.append([tlist[j],tlist[k]])
series.append([clist[j],clist[k]])
series.append([flist[j],flist[k]])
我排除了 j = k 的情况,因为否则存在无限多个解,其中每个元素相同且特征差为 0(例如 [13]、[13,13,13,13,13,13]、[13 ,13,13,13,13,13,13,13,13,13] ...)
因此,“系列”现在包括您可以从这些长度为 0、1 或 2 的列表中得出的每个算术序列。下一步是检查每个 2 长度算术序列中每个元素之间的差异,并编写代码再次检查一个数字是否存在差异。例如,列表 [7, 10] 的差异为 3,因此可以进入列表的下一个元素是“13”。我们可以编写代码,首先检查当前序列中的所有列表,然后检查任何列表中是否存在比最后一个元素更大的序列特征差异的数字,如果存在,则追加一个新列表(这是旧列表加上新元素)到系列列表。
这个问题听起来含糊不清,所以我不会为你做这件事,但希望我的评论能让你清楚你应该做什么。
算术序列由两个参数完整描述,即初始值和公差。假设
list1
包含所有初始值,list2
和 list3
表示序列中下一项的候选值。找出 list1
和 list2
之间的共同差异,然后找出 list2
和 list3
之间的共同差异。然后检查是否有相同的共同差异。如果是这样的话,你就有一个算术序列。
list1 = [7, 11, 52, 102, 144, 314]
list2 = [10, 29, 79, 94, 121, 146]
list3 = [13, 47, 184, 190, 544, 649]
cd1 = [] # list of common differences between list1 and list2
for l1 in list1:
cd1 += [(l1, i2, i2 - l1) for i2 in list2]
cd2 = [] # list of common differences between list2 and list3
for l2 in list2:
cd2 += [(l2, i3, i3 - l2) for i3 in list3]
arithmetics_seqs = []
for d1 in cd1:
# check if same common differences between cd1 and cd2
arithmetics_seqs += [d1[:2]+(d2[1],) for d2 in cd2 if d2[-1] == d1[-1]]
print(arithmetics_seqs)
输出
[(7, 10, 13), (11, 29, 47), (52, 121, 190), (102, 146, 190)]
我可能没有最好的计算方法,但是,我认为这对你有用 - 当然,列表越大,计算时间就越长。
list1 = [2,4,7]
list2 = [4,8,10]
list3 = [6,8,9]
for l1 in list1:
for l2 in list2:
for l3 in list3:
x = l1 - l2
y = l2 - l3
if x == y:
print(l1,l2,l3, " = arithmetic sequence Found")