将列表中的字符串出现与python

时间:2015-10-12 10:32:24

标签: python list dictionary

我有一个列表列表,每个列表中都有几个字符串。我想在列表中为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__'

1 个答案:

答案 0 :(得分:0)

您的代码中的基本问题是您将整数(Counter)作为直接值追加到stageTwoList,而不是作为其子列表的元素(即您应将其附加到{{1}不是row)。

这会导致stageTwoList中的最后一个元素成为您附加的整数,因此当迭代到达该元素时,stageTwoListrow,因此尝试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部分将被执行。