我已经读了好几篇文章,没有什么能帮到我。我找到了关于每个可能组合的信息,但我发现的是每个列表中所有值的组合,而不是列表本身。 (这里是我上一个关于导入access文件的问题的链接,以获取更多我正在做的事情的示例:How do I import an .accdb file into Python and use the data?)。你知道吗
假设我有一个从Access导入的列表。你知道吗
CreatureID Name Atk Def HP Type BattlePower
---------- -------- ------ ------ ----- --------- -----------
1 Snake 1000 500 200 Reptile 20
2 Mouse 500 200 100 Mammal 20
3 Turtle 200 2000 2000 Amphibian 40
4 Cat 1500 700 400 Mammal 20
5 Dog 1700 800 600 Mammal 40
6 Bird 100 100 200 Bird 20
7 Badger 2000 1500 1000 Mammal 40
8 Squirrel 300 200 200 Mammal 20
我一直在尝试找出如何使用导入的访问数据将每个生物的信息存储为一组列表。你知道吗
creatureList = [ [1, 'Snake', 1000, 500], [2, 'Mouse', 500, 200],
[3, 'Turtle', 200, 2000], [4, 'Cat', 1500, 700],
[5, 'Dog', 1700, 800], [6, 'Bird', 100, 100],
[7, 'Badger', 2000, 1500] ]
在我得到列表后,棘手的部分是我需要创建一组5个所有可能的生物组合。(完成此操作可能不需要上一步,但不确定)。你知道吗
group1List = [ [1, 'Snake', 1000, 500], [2, 'Mouse', 500, 200],
[3, 'Turtle', 200, 2000], [4, 'Cat', 1500, 700],
[5, 'Dog', 1700, 800] ]
group2List = [ [1, 'Snake', 1000, 500], [2, 'Mouse', 500, 200],
[3, 'Turtle', 200, 2000], [4, 'Cat', 1500, 700],
[6, 'Bird', 100, 100] ]
group3List = [ [1, 'Snake', 1000, 500], [2, 'Mouse', 500, 200],
[3, 'Turtle', 200, 2000], [4, 'Cat', 1500, 700],
[7, 'Badger', 2000, 1500]]
group4List = [ [2, 'Mouse', 500, 200], [3, 'Turtle', 200, 2000],
[4, 'Cat', 1500, 700], [5, 'Dog', 1700, 800],
[6, 'Bird', 100, 100] ]
group5List = [ [2, 'Mouse', 500, 200], [3, 'Turtle', 200, 2000],
[4, 'Cat', 1500, 700], [5, 'Dog', 1700, 800],
[7, 'Badger', 2000, 1500] ]
接下来的几个步骤,我希望能够将每个组的atk总能量和def总能量相加,并能够将它们相互比较,以找到总属性最高的组。你知道吗
group1total = [4900, 4200]
group2total = [3300, 3500]
group3total = [5200, 4900]
只是想让事情变得更难。这是工作代码。你知道吗
LIST = []
import pypyodbc
import itertools
import operator
pypyodbc.lowercase = False
conn = pypyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
r"Dbq=C:\Users\Ju\Desktop\Dark Summoner.accdb;")
cur = conn.cursor()
cur.execute("SELECT Number, ID, Name, Atk, Def, HP, BP, Species, Special FROM Impulse_AA");
while True:
row = cur.fetchone()
if row is None:
break
listadd = [row]
LIST = LIST+ listadd
GROUPS = max(((sum(map(lambda x:x[4]+x[5]+x[6],c)),c) for c in
itertools.combinations(LIST,5)),key=operator.itemgetter(0))[1]
我正在尝试存储可能的团队列表,以便稍后进行其他计算。不确定存储信息是最好的方法还是每次重新计算更好。你知道吗
但到目前为止,程序一直在运行,而且永远不会结束(或者至少在5-10分钟后不会结束)。在我目前的数据库中有189种生物,也就是1905305787种组合。你知道吗
之所以选择所有可能的组,是因为还有其他因素需要考虑。我已经更新了creatureList以反映几个因素来举个例子。你知道吗
BattlePower bonus = 10% atk and 10% def, all creatures have the same battle power
Type bonus = 15% atk and 15% def, all creatures have the same type
有32个不同的组合奖金检查后,团队创建。我想,创建一个列表,然后检查它是否有组奖金,比检查一个组,并在其中添加奖金,然后比较每一组,看看哪一组是最好的,要省力得多。同样,一旦列表被创建并存储了所有的max统计数据,那么我将尝试将其导出为microsoftaccess文档,这样我只需要在新的生物出现时运行计算。你知道吗
作为一行:
itertools.combinations(creatureList,5)
返回所有生物的5元素组合的迭代器。你知道吗(sum(map(lambda x:x[2]+x[3],c)),c)
是给定5元素组合的攻击/防御值和组合本身的元组。你知道吗max(...,key=...)
返回具有最大攻击/防御总和值的元组。你知道吗max(...)[1]
提取相应的组合。你知道吗更新
基于对问题的编辑和生物的数量(189),有一个更好的方法来说明问题,从而得到一个更简单的解决方案。你有效地将每个生物的攻击值和防御值相加,然后在5个生物的组合中寻找这些值的最大和。最大的总和将对应于5个个体攻击/防御总和最高的生物(因为总和是关联和交换的)。你知道吗
因此,你可以通过创建一个按攻击/防御总和排序的生物列表来获得你想要的结果,然后选择列表末尾的5种生物(这比尝试所有可能的组合要快得多):
这个解决方案的问题是它没有考虑攻击/防御总和相等的生物。当可能有多个解时,它只给出一个解。以下代码是处理该问题的一种方法:
考虑到这些生物:
结果是:
附加字段是攻击/防御总和。如果需要的话,很容易摆脱。但这是我留给你的练习。你知道吗
这叫做Combinations,Python有标准函数:itertools.combinations。你知道吗
请记住,组合的数量是
n!/(k!*(n-k!))
,所以它增长很快。对于100种生物来说,这将是7500万,而对于1000种生物来说,这将超过8万亿。使用迭代器,不要试图将其放入内存中的列表中。你知道吗相关问题 更多 >
编程相关推荐