基于循环中的匹配创build一个重复数据删除列表的列表? – Python,Openpyxl

我试图用Pycharm 2017.1.3。,Openpyxl 2.4.7和Excel 2016来实现这一点。

这里是我的数据集的一个较小的版本,对于初学者来说:

SHEET1:

| partID | keywordcategory |keyword| | 4849348| searchkeyword1 |Hobbock | 4849348| searchkeyword1 |Lentso* | 4849348| searchkeyword2 |Lentso| | 4849348| searchkeyword3 |LENTSO-EIEMR | | 4849348| searchkeyword3 |Hobbock | 4849346| searchkeyword1 |protein | 4849346| searchkeyword3 |ion 

我想要达到的结果是,对于每个唯一的零件号码:

A.获取每个关键字类别的唯一search字词的列表,AND

B.所有关键字类别中每个部件编号关键字的组合列表。 下面是我最喜欢的一个例子:

 | partID |searchkeyword1 |searchkeyword2|searchkeyword3|combined | 4849348| Hobbock;Lentso*|Lentso |LENTSO-EIMER |Hobbock;Lentso*; |Lentso; |LENTSO-EIMER | 4849346| protein | |ion |protein;ion 

这是我到目前为止所做的工作,但似乎并没有在每一行都创build新的列表。 导入openpyxl

 print('Opening file...') wb = openpyxl.load_workbook('keywords.xlsx') sheet1 = wb.get_sheet_by_name('Sheet1') sheet2 = wb.get_sheet_by_name('Sheet2') maxRow1 = sheet1.max_row + 1 maxRow2 = sheet2.max_row + 1 print('Processing...') for rowNum in range(1, maxRow2): for col in sheet1.iter_cols(min_row=1, min_col=2, max_col=2, max_row=1000): for cell in col: keywordlist = [] if cell.value == sheet2.cell(row=rowNum, column=1).value: if sheet1.cell(row=rowNum, column=3).value == 16985323: #if sheet1.cell(row=rowNum, column=4).value not in keywordlist and 'None' not in sheet1.cell(row=rowNum, column=4).value: keywordlist.append(sheet1.cell(row=rowNum, column=4).value + ';') sheet2.cell(row=rowNum, column=2).value = str(keywordlist) 

任何想法或帮助将不胜感激! 提前致谢!

编辑:查理的帮助已经比我更多得了我!

我现在遇到的问题是,当我尝试在我的实际项目上使用defaultdict(list)时,似乎并没有删除重复项。 当我尝试我在网上find的例子时,它工作,但不是与我的实际项目。

我认为这个问题可能是我如何生成字典。 这就是我现在正在做的事情:

 for rownum in range(1,maxRow): partnum = str(sheet1.cell(row=rownum, column=1).value) keyword1 = str(sheet1.cell(row=rownum, column=3).value) s = [(partnum,keyword1)] print(s) d = defaultdict(list) for k, v in s: d[k].append(v) 

如果您有任何帮助可以提供,我将不胜感激! 谢谢!

您应该分两个阶段来解决这个问题:首先build立一个search关键字词典:我已经在其他地方写过如何做到这一点,但是您想要为了您的目的而扩展它。 最简单的方法是使用像{1: ['Hobbock' 'Lentso'], 2:['Lentso'],…} defauldict的默认列表来使用默认的defauldict

然后,您可以遍历零件的列表或字典来编写行。