我有一个列表列表,每个列表中都有几个字符串。我想在列表中为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'联合利华'),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__'
答案 0 :(得分:0)
您的代码中的基本问题是您将整数(Counter)作为直接值追加到stageTwoList
,而不是作为其子列表的元素(即您应将其附加到{{1}不是row
)。
这会导致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
部分将被执行。