计算列表和附加列表中的元素

时间:2014-06-19 13:59:00

标签: python list iteration

我正在尝试在list中创建一个Python,其值从活动的excel表中提取。我希望它从excel文件中提取step#值并将其附加到列表中,同时还包括该元素的数量。例如,1_1第一次拉1,1_2第二次,1_3第三次,等等。我的代码如下...

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
CellNum = xl.ActiveSheet.UsedRange.Rows.Count
Steps = []
for i in range(2,CellNum + 1):  #Create load and step arrays in abaqus after importing from excel
if str(int(xl.Cells(i,1).value))+('_1' or '_2' or '_3' or '_4' or '_5' or '_6') in Steps:
    StepCount = 1
    for x in Steps:
        if x == str(int(xl.Cells(i,1).value))+('_1' or '_2' or '_3' or '_4' or '_5' or '_6'):
            StepCount+=1
    Steps.append(str(int(xl.Cells(i,1).value))+'_'+str(StepCount))
else:
    Steps.append(str(int(xl.Cells(i,1).value))+'_1')

据我所知,如果没有excel文件,程序将不会为你们中的任何人运行,但我只是想知道这是否是一个我错过的简单错误。当我运行它时,StepCount不会高于2,所以我收到一堆1_2,2_2,3_2等元素。我在下面发布了我的结果列表。

>>> Steps
['1_1', '2_1', '3_1', '4_1', '5_1', '6_1', '7_1', '8_1', '9_1', '10_1', '11_1', '12_1',
 '13_1', '14_1', '1_2', '14_2', '13_2', '12_2', '11_2', '10_2', '2_2', '3_2', '9_2',
 '8_2', '7_2', '6_2', '5_2', '4_2', '3_2', '2_2', '1_2', '2_2', '3_2', '4_2', '5_2', 
'6_2', '7_2', '8_2', '9_2', '10_2', '11_2', '12_2', '13_2', '14_2', '1_2', '2_2']

编辑#1:因此,如果('_1' or '_2' or '_3' or '_4' or '_5' or '_6')始终只使用_1,那么这行代码是否会影响我的计数器?

if x == str(int(xl.Cells(i,1).value))+('_1' or '_2' or '_3' or '_4' or '_5' or '_6'):

由于它仅使用_1,因此只会计算1_1而不会检查1_2, 1_3, 1_4, etc

编辑#2:现在我使用以下代码。我的输入列表也在下面。

from collections import defaultdict
StepsList = []
Steps = []
tracker = defaultdict(int)

for i in range(2,CellNum + 1):
    StepsList.append(int(xl.Cells(i,1).value))

>>> StepsList
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 14, 13, 12, 11, 10, 2, 3, 9, 8,
 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 2]

for cell in StepsList:
    Steps.append('{}_{}'.format(cell, tracker[cell]+1)) # This is +1 because the     tracker starts at 0
    tracker[cell]+=1

我从ValueError: zero length field name in format迭代块

中收到以下错误:for cell in StepsList:

编辑#3:搞定了。出于某种原因,它不喜欢

Steps.append('{}_{}'.format(cell, tracker[cell]+1))

所以我把它改成了

for cell in StepsList:
    tracker[cell]+=1
    Steps.append(str(cell)+'_'+str(tracker[cell]))

感谢您的所有帮助!

1 个答案:

答案 0 :(得分:1)

这一行:

if str(int(xl.Cells(i,1).value))+('_1' or '_2' or '_3' or '_4' or '_5' or '_6') in Steps:

不符合您的想法。 ('_1' or '_2' or '_3' or '_4' or '_5' or '_6')始终返回'_1'。它不会迭代寻找匹配项的or值系列。

如果没有看到预期的输入与预期的输出,很难指出你正确的方向来实际从你的代码中得到你想要的东西,但是你可能想要利用{{3}或itertools中的其他组合方法之一。

<强>更新

根据您的评论,我认为这是一种解决问题的方法。假设输入列表如下:

in_list = [1, 1, 1, 2, 3, 3, 4]

您可以执行以下操作:

from collections import defaultdict

tracker = defaultdict(int) # defaultdict is just a regular dict with a default value at new keys (in this case 0)
steps   = []

for cell in in_list:
    steps.append('{}_{}'.format(cell, tracker[cell]+1)) # This is +1 because the tracker starts at 0
    tracker[cell]+=1

结果:

 >>> steps
 ['1_1', '1_2', '1_3', '2_1', '3_1', '3_2', '4_1']

使用itertools的组合可能有更有效的方法来做到这一点,但这种方式肯定是最直接的