Technologic27 Technologic27 - 4 months ago 15
Python Question

IndexError: string index out of range python

I have the following list:

url_sims1=[('http://bp.velocityfrequentflyer.com/',
[(2, 0.90452874),
(1, 0.83522302),
(4, 0.77591574),
(0, 0.72705799),
(3, 0.52282226)]),
('http://cartrawler.virginaustralia.com/',
[(3, 0.79298556),
(1, 0.78112978),
(2, 0.76006395),
(0, 0.58570701),
(4, 0.40093967)]),
('https://cartrawler.virginaustralia.com/book',
[(2, 0.9549554),
(1, 0.71705657),
(0, 0.58731651),
(3, 0.43987277),
(4, 0.38266104)]),
('https://fly.virginaustralia.com/SSW2010/VAVA/webqtrip.html',
[(2, 0.96805269),
(4, 0.68034023),
(1, 0.66391909),
(0, 0.64251828),
(3, 0.50730866)]),
('http://www.magicmillions.com.au/',
[(2, 0.84748113),
(4, 0.8338449),
(1, 0.61795002),
(0, 0.60271078),
(3, 0.20899911)])]


I want to replace this order

(2,...)
(1,...)
(4,...)
(0,...)
(3,...)


with the following strings: categories=['arts and entertainment', 'points of passion', 'active lifestyle', 'consumer habits', 'travel savvy']. so for example, '2' will be replaced by categories[2]

I have written the following code:

for i in xrange(0, len(unique_url)):
for j in xrange(0, len(sims1)):
for k in xrange(0,len(categories)):
url_sims1[i][j][k][1]+=categories[k]


But I am getting this error: IndexError: string index out of range

unique_url=['http://bp.velocityfrequentflyer.com/',
'http://cartrawler.virginaustralia.com/',
'https://cartrawler.virginaustralia.com/book',
'https://fly.virginaustralia.com/SSW2010/VAVA/webqtrip.html',
'http://www.magicmillions.com.au/']

sims1=[[(2, 0.90452874),(1, 0.83522302),(4, 0.77591574),(0, 0.72705799),(3, 0.52282226)],
[(3, 0.79298556),(1, 0.78112978),(2, 0.76006395),(0, 0.58570701),(4, 0.40093967)],
[(2, 0.9549554),(1, 0.71705657),(0, 0.58731651),(3, 0.43987277),(4, 0.38266104)],
[(2, 0.96805269),(4, 0.68034023),(1, 0.66391909),(0, 0.64251828),(3, 0.50730866)],
[(2, 0.84748113),(4, 0.8338449),(1, 0.61795002),(0, 0.60271078),(3, 0.20899911)]]

Answer

Given that you have url_sims1 and categories, then try:

In [4]: [(url, [(categories[i], x) for i,x in lst]) for url,lst in url_sims1]
Out[4]: 
[('http://bp.velocityfrequentflyer.com/',
  [('active lifestyle', 0.9045),
   ('points of passion', 0.8352),
   ('travel savvy', 0.7759),
   ('arts and entertainment', 0.7271),
   ('consumer habits', 0.5228)]),
 ('http://cartrawler.virginaustralia.com/',
  [('consumer habits', 0.793),
   ('points of passion', 0.7811),
   ('active lifestyle', 0.7601),
   ('arts and entertainment', 0.5857),
   ('travel savvy', 0.4009)]),
 ('https://cartrawler.virginaustralia.com/book',
  [('active lifestyle', 0.955),
   ('points of passion', 0.7171),
   ('arts and entertainment', 0.5873),
   ('consumer habits', 0.4399),
   ('travel savvy', 0.3827)]),
 ('https://fly.virginaustralia.com/SSW2010/VAVA/webqtrip.html',
  [('active lifestyle', 0.9681),
   ('travel savvy', 0.6803),
   ('points of passion', 0.6639),
   ('arts and entertainment', 0.6425),
   ('consumer habits', 0.5073)]),
 ('http://www.magicmillions.com.au/',
  [('active lifestyle', 0.8475),
   ('travel savvy', 0.8338),
   ('points of passion', 0.618),
   ('arts and entertainment', 0.6027),
   ('consumer habits', 0.209)])]

Alternatively, if your starting point is unique_url and sims1, then try:

 [(url, [(categories[i], x) for i,x in lst]) for url,lst in zip(unique_url, sims1)]