Объедините все кортежи из списка в строку

#python #python-3.x

Вопрос:

Я хочу объединить все кортежи из списка в строку. Мне также нужно включить двоеточие между числами и пробел между числами и меридианом. Моя функция :

 def create_time_list(filename):
    f = open(filename,"r")

    f.seek(0)
    fchar = f.read(1)
    if not fchar:
        raise Exception("EmptyFileError")

    f.seek(0)

    list = []

    for line in f:
        subtuple = tuple(line.split())
        for i in subtuple:
            if len(i) > 2 or len(i) < 1 :
                raise Exception("ImproperTimeError")
        if not subtuple[0].isdigit() or not subtuple[1].isdigit() or (int(subtuple[0]) > 12) or (int(subtuple[1]) > 59):
            raise Exception("ImproperTimeError")
        list.append(subtuple)
    return list
 

Мой список :

 [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'), ('1', '34', 'AM'), ('12', '48', 'PM'), ('4', '13', 'AM'), ('11', '09', 'AM'), ('3', '12', 'PM'), ('4', '10', 'PM')]
 

Ввод :

     4 12 PM
    8 23 PM
    4 03 AM
    1 34 AM
    12 48 PM
    4 13 AM
    11 09 AM
    3 12 PM
    4 10 PM
 

Как я хочу вывести это :

 ['4:12 PM' , '8:23 PM' , '4:03 AM', '1:34 AM' , '12:48 PM' , '4:13 AM' , '11:09 AM' , '3:12 PM' , '4:10 PM']
 

Комментарии:

1. Пытаться: lst.append("{}:{} {}".format(*subtuple)) . Обратите внимание на переименованную переменную, так как вы не должны использовать это имя list .

Ответ №1:

Еще один способ:

 lst = [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'), ('1', '34', 'AM'), ('12', '48', 'PM'), ('4', '13', 'AM'), ('11', '09', 'AM'), ('3', '12', 'PM'), ('4', '10', 'PM')]

list_out = [f"{h}:{m} {abr}" for (h, m, abr) in lst]

print(list_out)
 

Результат:

 ['4:12 PM', '8:23 PM', '4:03 AM', '1:34 AM', '12:48 PM', '4:13 AM', '11:09 AM', '3:12 PM', '4:10 PM']
 

Ответ №2:

Один из лучших способов-это вы из map method :

 list_ = [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'),
         ('1', '34', 'AM'), ('12', '48', 'PM'), ('4', '13', 'AM'),
         ('11', '09', 'AM'), ('3', '12', 'PM'), ('4', '10', 'PM')]

print(list(map(lambda i: i[0] ':' i[1] ' ' i[-1], list_)))
 

Способ-2

автор [@schwobaseggl][1]

в этом случае логика работает как раз iterator over list так, и с помощью string-formatting добавления этой строки во вновь созданный список мы получим результат, и этот формат будет {}:{} {}

 list_ = [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'),
         ('1', '34', 'AM'), ('12', '48', 'PM'), ('4', '13', 'AM'),
         ('11', '09', 'AM'), ('3', '12', 'PM'), ('4', '10', 'PM')]

lst = []
for i in list_:
    lst.append("{}:{} {}".format(*i))

# for one line list creation we can use list-comp by [@Andres Silva][1]
lst = ["{}:{} {}".format(*subtuple) for subtuple in list_]

print(lst)
 

выход :

 ['4:12 PM', '8:23 PM', '4:03 AM', '1:34 AM', '12:48 PM', '4:13 AM', '11:09 AM', '3:12 PM', '4:10 PM']
 

Комментарии:

1. сказал мне , что этот список невозможно вызвать, я могу сделать что-то не так, если честно, вторая неделя python

2. Метод 3: использование понимания списка. lst = ["{}:{} {}".format(*subtuple) for subtuple in list_]

3.@DenisGojinetchi list -зарезервированное ключевое слово, используемое для top level function list list function объекта списка возврата

4. @денис, обратите внимание, что вы не должны использовать list в качестве переменной, так как это имя зарезервировано. Попробуйте изменить переменную list для некоторого изменения (например, list_ в приведенном выше решении), перезапустить ядро и снова запустить код.

Ответ №3:

Попробуй вот это.

 l = [
    ('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'),
    ('1', '34', 'AM'), ('12', '48', 'PM'), ('4', '13', 'AM'),
    ('11', '09', 'AM'), ('3', '12', 'PM'), ('4', '10', 'PM')
]

result = [f"{hh}:{mm} {xm}" for hh, mm, xm in l]

print(result)
# ['4:12 PM', '8:23 PM', '4:03 AM', '1:34 AM', '12:48 PM', '4:13 AM', '11:09 AM', '3:12 PM', '4:10 PM']
 

Известно, что понимание списков в python почти всегда происходит быстрее. Вы распаковываете переменные из кортежа в соответствующие переменные hh mm , xm а затем , используя эти переменные, создаете строку с помощью f-строк.

Ответ №4:

Попробуйте, x-это ваш список

 y = []
for timesTup in x:
    z = ':'.join((timesTup[0],timesTup[1]))
    y.append(z ' ' timesTup[-1])