Объединение слов рядом друг с другом из списка в Python - PullRequest
0 голосов
/ 19 октября 2018

Имеют несколько списков, преобразованных из файла .txt , которые были прочитаны как набор строк, которые выглядят следующим образом:

['New', 'Jersey', '1', '0', '1', '999']
['West', 'North', 'Central', '1', '0', '100', '90']

Эти списки имеют различное числослова бок о бок (у первого 2, у второго 3 и т. д.)

Я хочу вывести новый список (затем в скомпилированный фрейм данных), который объединяет слова, расположенные рядомсо стороны, например:

['New Jersey', '1', '0', '1', '999']
['West North Central', '1', '0', '100', '90']

Что сделает новый список (и фрейм данных) одинаковой длины.

Легко просто append(line.split()) создать новый список для каждой строки, но можноНе нужно вычислять оператор if и .join (), необходимые для объединения всех слов и добавления каждого числа отдельно.

Ответы [ 7 ]

0 голосов
/ 19 октября 2018

Я предлагаю следующие шаги:

1) Найти индексы для входных слов 2) Если у вас есть два или более последовательных индексов, которые не являются числовыми, добавьте их

Случай:

import re

numeric_regex = re.compile('[0-9]+?') #Regex to find numeric indices 
test = ['New', 'Jersey', '1', '0', '1', '999', 'West', 'North', 'Central', '1', '0']

#Comprehension to find word indices 
word_indices = [idx for idx, x in enumerate(test) if numeric_regex.match(x) is None]

#Comprehension to find indices to merge on
merge_on = [idx for idx, x in enumerate(word_indices) if word_indices[idx-1] == x-1]

На данный момент я нахожусь в тупике на способ сделать это без цикла for, поэтому я просто буду использовать цикл for:

reversed_merge_on = reversed(merge_on)
for x in reversed_merge_on:
    test[word_indices[x]-1] = ' '.join(test[word_indices[x]-1:word_indices[x]+1])
    del test[word_indices[x]]

Это поможет вам через любойданный список.Вы можете поместить его в функцию и применить ко многим спискам.Код выше будет работать как есть, так что вы можете скопировать в Python (я использую 2.7), чтобы убедиться в этом.

0 голосов
/ 20 октября 2018

Используйте понимание списка и объедините нецифровые элементы в один индекс, а затем распакуйте понимание списка для цифр.

lst = ['West', 'North', 'Central', '1', '0', '100', '90']
res = [' '.join([i for i in lst if not i.isdigit()]),*[i for i in lst if i.isdigit()]]
print(res)
# ['West North Central', '1', '0', '100', '90']
0 голосов
/ 19 октября 2018

Я в основном перебираю строки в списке list1.Если это слово, я добавляю его в list2, или же оно добавляется в list3.Метод isdigit () возвращает true, если строка состоит только из цифр.И, наконец, добавьте все содержимое списка list2 к ответу в виде единой строки, используя 'join', и используйте extend, чтобы добавить все элементы списка list3 в конец ответа [].

list1=['West North Central', '1', '0', '100', '90']
list2=[]
list3=[]
for i in list1:
    if i.isdigit():
        list3.append(i)
    else:
        list2.append(i)
answer = []
answer.append(' '.join(list2))
answer.extend(list3)
0 голосов
/ 19 октября 2018

Вы можете использовать itertools.groupby:

from itertools import groupby
l = [
    ['New', 'Jersey', '1', '0', '1', '999'],
    ['West', 'North', 'Central', '1', '0', '100', '90']
]
print([list.__add__(*(list(g) if k else [' '.join(g)] for k, g in groupby(s, key=str.isdigit))) for s in l])

Это выводит:

[['New Jersey', '1', '0', '1', '999'], ['West North Central', '1', '0', '100', '90']]
0 голосов
/ 19 октября 2018

Вы можете написать собственную функцию для конкатенации, например:

l = [
    ['New', 'Jersey', '1', '0', '1', '999'],
    ['West', 'North', 'Central', '1', '0', '100', '90']]

def my_concat(l):
    nl = []
    cur = None
    delim = ""
    for i in l:
        if isinstance(i, (str, unicode)) and i.isalpha():
            if cur == None:
                cur = ""
            cur += delim + i
            delim = " "
        else:
            if cur != None:
                nl.append(cur)
                cur = None
                delim = ""
            nl.append(i)
    return nl

for i in l:
    print my_concat(i)

output:

['New Jersey', '1', '0', '1', '999']
['West North Central', '1', '0', '100', '90']
0 голосов
/ 19 октября 2018

Используя itertools.groupby, вы можете сгруппировать по str.isalpha, соединить строки условно, а затем объединить в цепочку результаты:

from itertools import chain, groupby

L = ['New', 'Jersey', '1', '0', '1', '999']

grouper = groupby(L, key=str.isalpha)
joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
res = list(chain.from_iterable(joins))

print(res)

['New Jersey', '1', '0', '1', '999']
0 голосов
/ 19 октября 2018
line = ['West', 'North', 'Central', '1', '0', '100', '90']
words = []
nums = []

for word in line:
    if word.isalpha():
        words.append(word)
    else:
        nums.append(word)

new_line = [' '.join(words)]
new_line.extend(nums)

# new_line == ['West North Central', '1', '0', '100', '90']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...