我正在尝试在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]))
感谢您的所有帮助!
答案 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
的组合可能有更有效的方法来做到这一点,但这种方式肯定是最直接的