Задать вопрос
@heshhe

Как улучшить обработчик массива?

Есть массив:
[
['Место', 'адрес', 'время', 'событие, 'время', 'событие'], \
['Место', 'адрес', 'время', 'событие, 'время', 'событие', 'событие'], \
['Место', 'адрес', 'время', 'событие', 'событие', 'время', 'событие'], \
['Место', 'адрес', 'время', 'событие', 'событие']
]


На выходе нужно получить:

Place Место
Address адрес
Time время
Event событие

#следующий список..


Если есть два события то:

Place Место
Address адрес
Time время
Event событие
Event событие

#следующий список..


Если есть два времени то:

Place Место
Address адрес
Time время
Event событие
Time время
Event событие

#следующий список..


.. и так далее по аналогии

Вот как я это реализовал:
#zapros - массив
s=''
    i=0
    for line in zapros:
        s += 'Place '+ line[0] + '\n'+ 'Address   ' + line[1] + '\n' + ' Time ' + line[2] + '\n' + 'Event ' + line[3] + '\n'
        if len(zapros[i]) == 4 :
            s += '\n\n' 
     
        if len(zapros[i]) == 5 :
            s+='Event  '+line[4] +'\n\n'
        
        if len(zapros[i]) == 6 :    
            s+=' Time '+line[4] +'\n'+ 'Event  '+ line[5]+'\n\n' 

        if len(zapros[i]) == 7 :    
            s+=' Time '+line[4] +'\n'+ 'Event  '+ line[5]+'\n' + 'Event  '+ line[6]+'\n\n'

        if len(zapros[i]) == 8 :    
            s+=' Time '+line[4] +'\n'+ 'Event  '+ line[5]+'\n'+' Time '+line[6] +'\n'+ 'Event  '+ line[7]+'\n\n'

        if len(zapros[i]) == 9 :    
            s+=' Time '+line[4] +'\n'+ 'Event  '+ line[5]+'\n'+' Time '+line[6] +'\n'+ 'Event  '+ line[7]+'\n'+ 'Event  '+ line[8]+'\n\n'
        if len(zapros[i]) == 10 :   
            s+=' Time '+line[4] +'\n'+ 'Event  '+ line[5]+'\n'+' Time '+line[6] +'\n'+ 'Event  '+ line[7]+'\n'+' Time '+line[8] + 'Event  '+ line[9]+'\n\n'
            
        i+=1


Но, в моем же примере есть два списка с одинаковым количеством переменных - 7:
['Место', 'адрес', 'время', 'событие, 'время', 'событие', 'событие'], ['Место', 'адрес', 'время', 'событие', 'событие', 'время', 'событие']

Первый список пройдет как надо и на выходе мы получаем ожидаемый результат:

Place Место
Address адрес
Time время
Event событие
Time время
Event событие
Event событие


.. во втором варианте будет каша:

Place Место
Address адрес
Time время
Event событие
Time событие
Event время
Event событие


Как это исправить?
Как составить код таким образом, что бы он не зависел от количества объектов? (что бы не писать как сейчас, например, 10 условий)

Условие:
Место, адрес, время, событие - строки с разным кол-вом символов и с пробелами
  • Вопрос задан
  • 174 просмотра
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
С учетом имеющейся информации, попробуйте, как вариант, следующее:
Вложенный список, который мы получаем в самом начале (тестовый пример)

>>> events_data = [
['place1', 'address1', 'time1', 'event1'], ['place1', 'address1', 'time1', 'event2'],
['place2', 'address2', 'time1', 'event1'], ['place2', 'address2', 'time2', 'event1'],
['place2', 'address2', 'time2', 'event2'], ['place2', 'address2', 'time2', 'event3'],
['place3', 'address3', 'time1', 'event1'], ['place3', 'address3', 'time2', 'event1'],
['place3', 'address3', 'time2', 'event2'], ['place3', 'address3', 'time2', 'event3']
]

# Словарь для сортировки данных
>>> from collections import defaultdict
>>> events_dict = defaultdict(dict)
>>> for data in events_data:
	        *place, time, event = data
	        if time in events_dict[tuple(place)]:
		            events_dict[tuple(place)][time].append(event)
	        else:
		            events_dict[tuple(place)][time] = [event]

# Имеем
>>> pprint.pprint(dict(events_dict))
{('place1', 'address1'): {'time1': ['event1', 'event2']},
 ('place2', 'address2'): {'time1': ['event1'],
                          'time2': ['event1', 'event2', 'event3']},
 ('place3', 'address3'): {'time1': ['event1'],
                          'time2': ['event1', 'event2', 'event3']}}

# Выводим на печать
>>> for place in events_dict:
	        print('\nPlace: {}\nAddress: {}'.format(*place))	
	        for time, events_in_time in events_dict[place].items():
		            print('Time: ', time)
		            print(('Event: {}\n' * len(events_in_time)).format(*events_in_time), end='')

Результат вывода

Place: place1
Address: address1
Time: time1
Event: event1
Event: event2

Place: place2
Address: address2
Time: time1
Event: event1
Time: time2
Event: event1
Event: event2
Event: event3

Place: place3
Address: address3
Time: time1
Event: event1
Time: time2
Event: event1
Event: event2
Event: event3
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sanya84
@sanya84
Фанатик Python 3
Нуу если данные как есть то так)
data = [
['Место', 'адрес', 'время', 'событие', 'время', 'событие'], \
['Место', 'адрес', 'время', 'событие', 'время', 'событие', 'событие'], \
['Место', 'адрес', 'время', 'событие', 'событие', 'время', 'событие'], \
['Место', 'адрес', 'время', 'событие', 'событие']
]

my_dict = {'Место': 'Place', 'адрес': 'Address', 'время': 'Time', 'событие': 'Event'}

def main():
    for i in range(len(data)):
        print("#следующий список...")
        for j in data[i]:
            print(my_dict[j], j)


if __name__ == '__main__':
    main()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы