Форум программистов, компьютерный форум CyberForum.ru

Python: научные вычисления

Войти
Регистрация
Восстановить пароль
 
natasha_la
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 4
#1

Задача несложная, но я что-то упускаю - Python

15.10.2016, 13:49. Просмотров 315. Ответов 3
Метки нет (Все метки)

Привет всем!

Пытаюсь реализовать такую задачу:
"Написать функцию mesi(lst), которая возвращает список длинной, равной длине введенного списка lst. В возвращаемом списке, каждый элемента i (если элемент i в списке lst – это строка, отображающая дату в формате dd-mm-yyyy, где dd – день, mm – месяц, yyyy - год) которого содержит строку с той же датой, но месяц заменен на прописной вариант (вместо 05 будет 'май'). Если элемент не соответствует этому формату, то выводится символ '*'.
Високосный год не берется в расчет
"


Например:
lst = [1,'10-10-2007', '2-3-1962','house', '31-11-2007']
на выходе - [ '*', 'ottobre', '*', '*', '*']
lst = ['5/6/1991','5-7-1991','7-6-1990-3', 'esercizio', '06-06-19a1']
на выходе - [ '*', 'ottobre', '*', '*', '*']
lst = ['*','02-06-2019', '2-06-2006','Python', '30-02-1982', '25-02-1982']
на выходе - [ '*', 'giugno','*', '*', '*', 'febbraio']

Задание понятно:
- найти строки, в которых ровно 10 символов (т.к. формат dd-mm-yyyy задействует ровно 10 символов)
- dd - должно быть от 01 до 31 в соответствующих месяцах, от 01 до 30 в месяцах, в которых 30 дней и в в фев от 01 до 28 дней (даты 31-11-2015 не существует, например, т.к. в ноябре 30 дней)
- yyyy должен быть числом!!!

Сразу скажу, что только 3 недели изучаю python не всегда знаю, как выразить в коде то, что хочу написать да еще так, чтобы это работало.

начинаю я так:
def mesi(lst):
for i in lst:
dd = i.split('-')[0]
mm = i.split('-')[1]
yy = i.split('-')[2]
if len(i)== 10:

а дальше начинаю путаться с условиями if и тем, что нужно выводить....

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

Заранее спасибо за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2016, 13:49     Задача несложная, но я что-то упускаю
Посмотрите здесь:

Несложная задача по теории вероятности!
Delphi несложная задача
C++ Несложная задача,условие на фото
Pascal ABC Задача с матрицей (несложная)
Assembler работа с битами и условиями (как мне кажется задача несложная)
Парсер php - я сделал 90% но что-то упускаю PHP

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
regio1961
105 / 105 / 49
Регистрация: 06.06.2016
Сообщений: 242
15.10.2016, 16:40     Задача несложная, но я что-то упускаю #2
Для этой задачи проще всего использовать регулярные выражения
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re
#######################################################################
def mesi( lst ):
    pattern = re.compile(r'\d\d-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{4}')
    result = [];
    for i in range( len( lst ) ):
        res = pattern.findall( lst[i] )
        if res:
            result += res
        else:
            result += "*"    
    print( result )
#######################################################################
data = [ "12-Jan-1212", "22.09.77", "11-09-2001", "11-Feb-1999" ]
mesi( data )
Названия месяцев, если необходимо, замените.
natasha_la
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 4
16.10.2016, 15:34  [ТС]     Задача несложная, но я что-то упускаю #3
Интересно решено! Для меня - стимул как можно скорее дойти до регулярных выражений, т.к. они значительно сокращают работу!!

Но есть пару нюансов:
во входящем списке элементом может быть также набор символов, отличный от формата dd-mm-yyyy
я напечатаю свое решение, которое явно супердилетантское, но вроде работает правильно. только одна загвоздка - не могу сообразить как задать условие, что переменная аа (у меня обозначает год) не может быть 19а4, т.е не может содержать никаких символов, кроме цифр


Вот такое громоздкое у меня решение

def mesi(lst):
lst2 = []
for i in lst:
i = str(i)
if len(i)== 10 and i[2] == '-' and i[5] == '-':
gg = i.split('-')[0]
mes = i.split('-')[1]
aa = i.split('-')[2]
if gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31'] and mes in ['01', '03', '05', '08', '10', '12'] :
if mes == '01':
lst2.append('gennaio')
elif mes == '03':
lst2.append('marzo')
elif mes == '05':
lst2.append('maggio')
elif mes == '07':
lst2.append('luglio')
elif mes == '08':
lst2.append('agosto')
elif mes == '10':
lst2.append('ottobre')
elif mes == '12':
lst2.append('dicembre')
else:
lst2.append('*')

elif (gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31'] and mes in ['01', '03', '05', '08', '10', '12']) or mes in ['01', '03', '05', '08', '10', '12']:
lst2.append( '*')

if gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'] and mes in ['04', '06', '09', '11'] and aa != '19a1':
if mes == '04':
lst2.append('aprile')
elif mes == '06':
lst2.append('giugno')
elif mes == '09':
lst2.append('settembre')
elif mes == '11':
lst2.append('novembre')

else:
lst2.append('*')



elif (gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'] and mes in ['04', '06', '09', '11']) or mes in ['04', '06', '09', '11']:
lst2.append('*')

if gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28'] and mes in ['02']:
lst2.append('febbraio')

elif (gg in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28'] and mes in ['02']) or mes in ['02']:
lst2.append('*')

else:
lst2.append('*')
return lst2


но когда на входе они получает lst = ['*','02-06-2019', '2-06-2006','Python', '30-02-1982', '25-02-1982'], функция выводит правильный результат : [ '*', 'giugno','*', '*', '*', 'febbraio']
regio1961
105 / 105 / 49
Регистрация: 06.06.2016
Сообщений: 242
16.10.2016, 16:03     Задача несложная, но я что-то упускаю #4
Цитата Сообщение от natasha_la Посмотреть сообщение
Но есть пару нюансов:
во входящем списке элементом может быть также набор символов, отличный от формата dd-mm-yyyy
А вы поэкспериментируйте с моим кодом, задайте "неправильные" данные.
Yandex
Объявления
16.10.2016, 16:03     Задача несложная, но я что-то упускаю
Ответ Создать тему
Опции темы

Текущее время: 20:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru