список списков, но специфичных представлений в python

#python #list

#python #Список

Вопрос:

У меня нет большого опыта работы со списками в Python. Итак, в принципе, я хочу создать N list внутри одного огромного списка. Чтение из файла, который выглядит следующим образом:

 Fail = h yes
Sucess = h no
  

Это пример 2 строк в файле, и файл содержит N строк, поэтому я хочу создать список для каждой строки таким образом, чтобы он был:

 List of list = [
        ["Fail", ("h", "yes")],
        ["Sucess", ("h", "no")]],]
  

И в случае, если строка:

 Fail = h 
  

при наличии только одного вывода его список должен иметь вид:

 ["Fail", ("h", )),]
  

Мой код пока не работает,:

 with open('file.txt') as f:
     for l in f:
         l_rule = l.split()
        # print(l_rule)
         G_list.append(l_rule[0])
         length= len(l_rule)
         if length == 3:

                 m = "("   l_rule[2]  ","  ")"
                 G_list.append(m)


         else:


                 m = "("   l_rule[2] "," l_rule[3]  ")"
                 G_list.append(m)

         print(G_list)
         listoflist.append(G_list)

print(listoflist)
  

И он не возвращает то, что мне нужно, как я объяснил выше. Я ценю помощь.

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

1. Обратите внимание, что ["Fail", ("h", )),] это синтаксически недопустимо. Я полагаю, вы имели в виду ["Fail", ("h", )] .

Ответ №1:

Разделите каждую строку и распакуйте ее. Затем вы можете проверить, был ли найден необходимый последний элемент, и создать соответствующий кортеж. Добавьте результат в свой список результатов.

 with open('file.txt') as f:
    result = []
    for line in f:
        a,b,c,*d = line.split()
        if d:
            tup = c,d[0]
        else:
            tup = c,
        result.append([a, tup])
  

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

1. Хм, не могли бы вы обойтись tup = (c,) tuple(d) без проверки?

Ответ №2:

Вы не можете использовать строковые функции для создания кортежа — ("h", "yes")

Вам нужно

 m = ( l_rule[2], ) 

m = ( l_rule[2], l_rule[3] ) 
  

РЕДАКТИРОВАТЬ: я обнаружил, что вам нужно очистить G_list , прежде чем добавлять новые элементы

  G_list = []

 G_list.append(l_rule[0])
  

РЕДАКТИРОВАТЬ: код с изменениями

 with open('file.txt') as f:
     for l in f:

         l_rule = l.split()

         G_list = []  # clear list

         G_list.append(l_rule[0])

         length= len(l_rule)

         if length == 3:
                 m = (l_rule[2],)  # create tuple instead of string
                 G_list.append(m)
         else:
                 m = (l_rule[2], l_rule[3])  # create tuple instead of string
                 G_list.append(m)

         print(G_list)
         listoflist.append(G_list)

print(listoflist)
  

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

1. Можете ли вы объяснить больше? и опубликовать точные версии? Я не мог понять

2. вы создаете единую строку '("h", "yes")' , а не кортеж из двух элементов "h" и "yes"

Ответ №3:

Попробуйте это:

 def format_data(line):
    lst = line.split()
    return lst[0], tuple(lst[2:])

with open('file.txt') as f:
    for l in f:
        G_list.append(format_data(l))
listoflist.append(G_list)
  

или вы можете сделать one_liner внутри вашего with оператора.

 with open('file.txt') as f:
    listoflist = [format_data(l) for l in f]
  

Ответ №4:

Один из простых способов — выполнить два прохода разделения, сначала по = , а затем по пробелам (по умолчанию для split ). Используйте strip по мере необходимости:

 >>> import io
>>> s = """Fail = h yes
... Sucess = h no
... Fail = h """
>>> 
>>> L = [line.strip().split('=') for line in io.StringIO(s)]
>>> [[sub[0].strip(),tuple(sub[1].strip().split())] for sub in L]
[['Fail', ('h', 'yes')], ['Sucess', ('h', 'no')], ['Fail', ('h',)]]
>>> 
  

Если проблема с памятью, вы можете адаптировать приведенное выше для ленивой обработки строк.