如何从access导入的数据创建一组列表?

2024-04-28 06:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经读了好几篇文章,没有什么能帮到我。我找到了关于每个可能组合的信息,但我发现的是每个列表中所有值的组合,而不是列表本身。 (这里是我上一个关于导入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文档,这样我只需要在新的生物出现时运行计算。你知道吗


Tags: andimport信息列表生物listcatturtle
2条回答

作为一行:

>>> max(((sum(map(lambda x:x[2]+x[3],c)),c) for c in
        itertools.combinations(creatureList,5)),key=operator.itemgetter(0))[1]
([1, 'Snake', 1000, 500],
 [3, 'Turtle', 200, 2000],
 [4, 'Cat', 1500, 700],
 [5, 'Dog', 1700, 800],
 [7, 'Badger', 2000, 1500])

itertools.combinations(creatureList,5)返回所有生物的5元素组合的迭代器。你知道吗

(sum(map(lambda x:x[2]+x[3],c)),c)是给定5元素组合的攻击/防御值和组合本身的元组。你知道吗

max(...,key=...)返回具有最大攻击/防御总和值的元组。你知道吗

max(...)[1]提取相应的组合。你知道吗

更新

基于对问题的编辑和生物的数量(189),有一个更好的方法来说明问题,从而得到一个更简单的解决方案。你有效地将每个生物的攻击值和防御值相加,然后在5个生物的组合中寻找这些值的最大和。最大的总和将对应于5个个体攻击/防御总和最高的生物(因为总和是关联和交换的)。你知道吗

因此,你可以通过创建一个按攻击/防御总和排序的生物列表来获得你想要的结果,然后选择列表末尾的5种生物(这比尝试所有可能的组合要快得多):

>>> [x for x in sorted(creatureList,key=lambda x: x[2]+x[3])][-5:]
[[1, 'Snake', 1000, 500],
 [3, 'Turtle', 200, 2000],
 [4, 'Cat', 1500, 700],
 [5, 'Dog', 1700, 800],
 [7, 'Badger', 2000, 1500]]

这个解决方案的问题是它没有考虑攻击/防御总和相等的生物。当可能有多个解时,它只给出一个解。以下代码是处理该问题的一种方法:

result = list()  # the desired list of 5 creature groups
base   = list()  # the prefix of all 5 creature groups
length = 5       # the number of creatures remaining to create a 5 creature list
for group in reversed([[x for x in g] 
              for k,g in itertools.groupby(
                  sorted(map(lambda x: x + [x[2]+x[3]],creatureList),
                         key=operator.itemgetter(4)),
                  key=operator.itemgetter(4))]):
    grouplen = len(group)
    if grouplen <= length:
        base.extend(group)
        length -= grouplen
    elif length:
        for c in itertools.combinations(group,length):
            result.append(base + list(c))
        break

考虑到这些生物:

[ [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],
  [8, 'XXX', 500, 1000] ]

结果是:

 [ [ [7, 'Badger', 2000, 1500, 3500],
     [5, 'Dog', 1700, 800, 2500],
     [3, 'Turtle', 200, 2000, 2200],
     [4, 'Cat', 1500, 700, 2200],
     [1, 'Snake', 1000, 500, 1500] ],
   [ [7, 'Badger', 2000, 1500, 3500],
     [5, 'Dog', 1700, 800, 2500],
     [3, 'Turtle', 200, 2000, 2200],
     [4, 'Cat', 1500, 700, 2200],
     [8, 'XXX', 500, 1000, 1500] ] ]

附加字段是攻击/防御总和。如果需要的话,很容易摆脱。但这是我留给你的练习。你知道吗

这叫做Combinations,Python有标准函数:itertools.combinations。你知道吗

请记住,组合的数量是n!/(k!*(n-k!)),所以它增长很快。对于100种生物来说,这将是7500万,而对于1000种生物来说,这将超过8万亿。使用迭代器,不要试图将其放入内存中的列表中。你知道吗

相关问题 更多 >