我有一个列表列表,每个列表中都有几个字符串。我想给ID一个清单中的项目。通过所需的输入和输出更容易解释。
输入(将是更大的数据集,但具有相同的结构):[[u'ID1',u'Loreal',(u'Loreal',u'P&G'),1、2],[u'ID1',u 'P&G',(u'Loreal',u'P&G'),1、2],[u'ID1',u'Loreal',(u'Loreal',u'Unilever'),2、1]]
欲望输出:[[u'ID1 'u'Loreal',(u'Loreal 'u'P&G '),1,2,1 ],[u'ID1',u'P&G',( u'Loreal 'u'P&G '),1,2,2 ],[u'ID1',u'Loreal',(u'Loreal 'u'Unilever'),2,1,1 ]
应根据位于每个列表的索引1中的公司名称来提供ID。例如Loreal为1,P&G为2,依此类推。
我的想法是创建一个字典,并检查每一行是否[1]是字典中的键。如果是,则添加该键的值(即ID)。否则,在键和ID的字典中创建一个键值对(使用计数器)。
到目前为止,我的代码:
stageTwoDic = {}
dictionaryCounter = 1
for row in stageTwoList:
for key in stageTwoDic:
if key == row[1]:
stageTwoList.append(stageTwoDic[row[1]])
else:
stageTwoDic[row[1]] = dictionaryCounter
stageTwoList.append(dictionaryCounter)
dictionaryCounter += 1
我收到以下错误消息:
if key == row[1]:
TypeError: 'int' object has no attribute '__getitem__'
代码中的基本问题是,您将整数(Counter)作为直接值附加到stageTwoList
,而不是作为其子列表的元素(也就是说,应将其附加到row
not stageTwoList
)。
这将导致最后一个元素stageTwoList
为您附加的整数,因此当迭代到达该元素时,row
即为int
,因此尝试这样做row[1]
会导致您得到错误。
同样,您无需循环将字典中的键循环抛出来检查键是否存在,您可以使用in
运算符来实现。
您应该改为执行以下操作-
stageTwoDic = {}
dictionaryCounter = 1
for row in stageTwoList:
if row[1] in stageTwoDic:
row.append(stageTwoDic[row[1]])
else:
stageTwoDic[row[1]] = dictionaryCounter
row.append(dictionaryCounter)
dictionaryCounter += 1
演示-
>>> stageTwoList = [[u'ID1', u'Loreal', (u'Loreal', u'P&G'), 1, 2], [u'ID1', u'P&G', (u'Loreal', u'P&G'), 1, 2], [u'ID1', u'Loreal', (u'Loreal', u'Unilever'), 2, 1]]
>>> stageTwoDic = {}
>>> dictionaryCounter = 1
>>> for row in stageTwoList:
... if row[1] in stageTwoDic:
... row.append(stageTwoDic[row[1]])
... else:
... stageTwoDic[row[1]] = dictionaryCounter
... row.append(dictionaryCounter)
... dictionaryCounter += 1
...
>>> stageTwoList
[['ID1', 'Loreal', ('Loreal', 'P&G'), 1, 2, 1], ['ID1', 'P&G', ('Loreal', 'P&G'), 1, 2, 2], ['ID1', 'Loreal', ('Loreal', 'Unilever'), 2, 1, 1]]
只是为了完成起见,代码中的另一个问题是您实际上正在更新stageTwoList
,即使row[1]
在字典中找到了也是如此,因为您没有break
在该if
块内。如果循环正常退出(没有语句或异常),则将执行构造的else
一部分。for..else
for
break
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句