#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',)]]
>>>
Если проблема с памятью, вы можете адаптировать приведенное выше для ленивой обработки строк.