2015-01-14 5 views
0

Я пытаюсь объединить множество списков вместе на основе общего индекса. Общий индекс - это юлианская дата (JD), и я хотел бы объединить все остальные времена в других списках, которые используют один JD в один список, содержащий единственный JD и все соответствующие времена. Тем не менее, я продолжаю получать индексы «TypeError: list должны быть целыми, а не кортежем», и я не уверен, почему это происходит. Я не изначально назначаю переменную «list_of_lsts» фактический список списков, или я беспорядок где-то в моем цикле. Мой конечный результат был бы следующим:Группировка списков в Python

['2014-158', '20:07:11.881', '20:43:04.546', '20:43:47.447', '21:11:08.997', '21:11:16.697', '21:22:07.717'] 
['2014-163', '17:12:09.071', '17:38:08.219', '17:38:28.310', '17:59:25.649','18:05:59.536', '18:09:53.243','18:13:47.671', '18:16:53.976', '18:20:31.538', '18:23:02.243'] 

Я буду делать это для многих юлианских дат, поэтому цикл необходим. Я новый программист и, прежде всего, новичок в Python 2.7.8, поэтому, пожалуйста, простите невежество и обильные ошибки. Спасибо.

lst_of_lsts = (['2014-158', '20:07:11.881', '20:43:04.546'] 
       ['2014-158', '20:43:47.447', '21:11:08.997'] 
       ['2014-158', '21:11:16.697', '21:22:07.717'] 
       ['2014-163', '17:12:09.071', '17:38:08.219'] 
       ['2014-163', '17:38:28.310', '17:59:25.649'] 
       ['2014-163', '18:05:59.536', '18:09:53.243'] 
       ['2014-163', '18:13:47.671', '18:16:53.976'] 
       ['2014-163', '18:20:31.538', '18:23:02.243']) 


def merge_subs(lst_of_lsts): 
    res = [] 
    for row in lst_of_lsts: 
     for i, resrow in enumerate(res): 
      if row[0]==resrow[0]: 
       res[i] += row[1:] 
       break 
      else: 
       res.append(row) 
     return res 
+0

Вы пропускаете запятую после каждого подсписка в lst_of_lsts – Imran

ответ

1
def merge_subs(L): 
    dates = {} 
    for sub in L: 
     date = sub[0] 
     if date not in dates: 
      dates[date] = [] 
     dates[date].extend(sub[1:]) 
    answer = [] 
    for date in sorted(dates): 
     answer.append([date] + dates[date]) 
    return answer 

Выход:

In [28]: lst_of_lsts = (['2014-158', '20:07:11.881', '20:43:04.546'], 
['2014-158', '20:43:47.447', '21:11:08.997'], 
['2014-158', '21:11:16.697', '21:22:07.717'], 
['2014-163', '17:12:09.071', '17:38:08.219'], 
['2014-163', '17:38:28.310', '17:59:25.649'], 
['2014-163', '18:05:59.536', '18:09:53.243'], 
['2014-163', '18:13:47.671', '18:16:53.976'], 
['2014-163', '18:20:31.538', '18:23:02.243']) 

In [29]: merge_subs(lst_of_lsts) 
Out[29]: [['2014-158', '20:07:11.881', '20:43:04.546', '20:43:47.447', '21:11:08.997', '21:11:16.697', '21:22:07.717'], 
      ['2014-163', '17:12:09.071', '17:38:08.219', '17:38:28.310', '17:59:25.649', '18:05:59.536', '18:09:53.243', '18:13:47.671', '18:16:53.976', '18:20:31.538', '18:23:02.243']] 
+0

Я ценю вход. Это хорошо работает. Глупая ошибка, оставляющая запятые между каждым списком. Не очень хорошо знаком с этим языком, поэтому мой синтаксис не так уж хорош. В настоящее время я работаю над написанием этого вывода в текстовом файле. Можно ли записать в новый файл, содержащий вывод из цикла? Cheers – CodingCaribou

+0

@NeophyteAK: Да, можно записать в новый файл. Я бы посоветовал вам взглянуть на документы и попробовать сначала, так как есть несколько способов сделать это. – inspectorG4dget

+0

Звучит неплохо. благодаря – CodingCaribou

1

Изменения в

lst_of_lsts = (['2014-158', '20:07:11.881', '20:43:04.546'], 
['2014-158', '20:43:47.447', '21:11:08.997'], 
['2014-158', '21:11:16.697', '21:22:07.717'], 
['2014-163', '17:12:09.071', '17:38:08.219'], 
['2014-163', '17:38:28.310', '17:59:25.649'], 
['2014-163', '18:05:59.536', '18:09:53.243'], 
['2014-163', '18:13:47.671', '18:16:53.976'], 
['2014-163', '18:20:31.538', '18:23:02.243']) 

То есть, вам не хватает запятых.

Другое изменение, которое я хотел бы предложить:

for i, resrow in enumerate(res): 
     if row[0]==resrow[0]: 
      res[i] += row[1:] 

res[i] Здесь и resrow являются одни и те же вещи - как в изменении к одной изменится другой. Нет необходимости иметь их обоих. Вместо этого сделайте

for resrow in res: 
    if row[0] == resrow[0]: 
     resrow += row[1:] 

Также - как в настоящее время отступом, иначе это не будет сделано, если сбой завершен. Скорее, это будет сделано после цикла for. Я не думаю, что это то, что вы намерены.

Действительно, хотя вы хотите использовать dict.

def merge_subs2(lst_of_lsts): 
    date_dict = {} 
    for row in lst_of_lsts: 
     if row[0] not in date_dict: 
      date_dict[row[0]] = [row[0]] #note that I'm putting row[0] here already. 
     date_dict[row[0]].extend(row[1:]) 
    returnlist = date_dict.values() 
    returnlist.sort() #sorting because dicts don't have an order to them. 
    return returnlist 
+0

Спасибо за упоминание использования словаря. Я не знал об этой структуре данных. Я понимаю, почему это имеет смысл. Я еще раз посмотрю на использование этой структуры данных. – CodingCaribou

Смежные вопросы