Разделить список Python на вложенный список - PullRequest
0 голосов
/ 08 ноября 2019

Привет любителям питона !! У меня есть текстовый файл с таким содержимым.

Pakistan[country]\n
Karachi\n
lahore\n
islamabad\n
UAE[country]\n
dubai\n
sharjah\n
India[country]\n
goa\n
chennai\n

Я читаю этот файл, используя этот код.

mylist = list(open('data.txt', 'r'))

Теперь у меня есть все элементы в структуре списка, но я хочупреобразовать это во вложенный список, структуру списка, как показано ниже.

[['Pakistan', 'Karachi', 'lahore', 'islamabad'],['UAE', 'dubai', 'sharjah'],['India', 'goa', 'chennai']]

Пожалуйста, помогите мне преобразовать этот текст в структуру выше.

Ответы [ 6 ]

3 голосов
/ 08 ноября 2019

Вот, пожалуйста:

>>> result = []
>>> for entry in mylist:
        if entry.endswith('[country]'):
            country= entry[:entry.rindex('[')]
            result.append([country])
        else:
            result[-1].append(entry)


>>> result
[['Pakistan', 'Karachi', 'lahore', 'islamabad'], ['UAE', 'dubai', 'sharjah'], ['India', 'goa', 'chennai']]
1 голос
/ 08 ноября 2019

Отказ от ответственности: это решение не для слабонервных и на самом деле не расставляет приоритеты читаемости.

Я немного заинтригован тем, что ни один из опубликованных в настоящее время ответов не решает эту проблемуна .split("[country]"). Вот решение для понимания списка без использования циклов for:

 # read file this way to preserve line structure:
 with open('data.txt', 'r') as f:
     data = f.read().strip().split("\n")

 # First: move the "[country]" tag from behind to in front of the name.
 # Also, I replace "[country]" with "*" for no other reason than that it's shorter
 data = ",".join(["*"+x.replace("[country]","") if x.endswith("[country]") else x for x in data])

 # Then, split on "[country]", that is: ",*",
 # But keep in mind that the very first country will have prefix "*", not ",*"
 data = [x.replace("*","").split(",") for x in data.split(",*")]

 print(data)
 #[['Pakistan', 'Karachi', 'lahore', 'islamabad'], ['UAE', 'dubai', 'sharjah'], ['India', 'goa', 'chennai']]

Затем, если вы можете изменить формат файла данных таким образом, чтобы тег [country] был установлен вперед названием страны, а не после, тогда это немного проще, и вы получите простой однострочный:

 with open('data2.txt', 'r') as f:
     data = f.read().strip().split("[country]")

 data = [x.strip().replace("[country]","").split("\n") for x in data[1:]]

 print(data)
 #[['Pakistan', 'Karachi', 'lahore', 'islamabad'], ['UAE', 'dubai', 'sharjah'], ['India', 'goa', 'chennai']]
1 голос
/ 08 ноября 2019
my_list = list(open('data.txt', 'r'))    
j = -1
for country in my_list:
    if country.__contains__('[country]'):
        country = country[:country.find('[country]')]
        result.append([country])
        j += 1
    else:
        country = country[:country.find('\n')]
        result[j].append(country)
1 голос
/ 08 ноября 2019
temp = StringIO("""  
Pakistan[country]\n
Karachi\n
lahore\n
islamabad\n
UAE[country]\n
dubai\n
sharjah\n
India[country]\n
goa\n
chennai\n
""")


df = pd.read_csv(temp, sep='\s+', engine='python',header=None)


с использованием re.split
country_l = ' '.join(list(df[0]))
[i.replace('[country]','').split() for i in re.split('\s(?=\w*\[country\])',country_l)]

##output
[['Pakistan', 'Karachi', 'lahore', 'islamabad'],
 ['UAE', 'dubai', 'sharjah'],
 ['India', 'goa', 'chennai']]
1 голос
/ 08 ноября 2019
mylist = list(open('data.txt', 'r'))

superlist = []
countrylist = []
for entry in mylist:
    if '[country]' in entry:
        superlist.append(countrylist)
        countrylist = [entry.replace('[country]', '')]
    else:
        countrylist.append(entry)

if len(countrylist) > 0:
    superlist.append(countrylist)

1 голос
/ 08 ноября 2019

Вы можете сделать что-то вроде этого.

results = []
tmp =[]
with open("data.txt", "r") as file:
    for line in file:
        if "country" in line:
            if tmp:
                results.append(tmp)
             tmp = []
             line = line.replace("[country]", "")
        tmp.append(line.strip())
     results.append(tmp)
print(results)   
...