Невозможно использовать .strip () в многомерном списке - PullRequest
1 голос
/ 12 июня 2019

У меня есть многомерный список с таким макетом

[['Company Name      ', ['companyemail@email.com']]
['Company Name   ', ['companyemail@email.com','companyemail@email.com']]
['Company Name', ['companyemail@email.com']]
['Company Name          ', ['companyemail@email.com']]]

Мне нужно удалить пробелы до и после имен в первом индексе в каждом элементе.

У меня естьуже пробовал это:

def name_filter(vendors):
    unfiltered=vendors
    filtered=[]
    count=0
    for i in unfiltered:
        filtered = [x.strip(' ') for x in unfiltered[count][0]]
        count+=1
    return filtered

Однако, когда я распечатываю список, он не отображает ничего, кроме одной буквы

Мой ожидаемый результат:

[['Company Name', ['companyemail@email.com']]
['Company Name', ['companyemail@email.com','companyemail@email.com']]
['Company Name', ['companyemail@email.com']]
['Company Name', ['companyemail@email.com']]]

Ответы [ 6 ]

3 голосов
/ 12 июня 2019

Я хотел бы сделать это рекурсивно - убрать каждый элемент, если это строка, или повторить, если это список:

def recursive_strip(lst):
    return [(elem.strip() if type(elem) == str else recursive_strip(elem)) for elem in lst]

Возможно, вам придется учесть, какие типы данных может содержать список (в приведенном выше предположении предполагается, чтотолько строки или списки).

2 голосов
/ 12 июня 2019

Вы можете использовать str.rstrip ()

vendors = \
    [['Company Name      ', ['companyemail@email.com']],
    ['Company Name   ', ['companyemail@email.com','companyemail@email.com']],
    ['Company Name', ['companyemail@email.com']],
    ['Company Name          ', ['companyemail@email.com']]]


filtered_vendors = [[vendor[0].rstrip(),vendor[1]] for vendor in vendors]  
2 голосов
/ 12 июня 2019

Проблема в том, что вы используете цикл for для первого элемента каждого списка, а затем удаляете пробелы.В результате вы получаете отдельных персонажей.Вам не нужна секунда для цикла внутри списка понимания .Просто удалите первый строковый элемент и добавьте второй одновременно.PS: я также определил вложенный список vendors как входной, потому что я предполагаю, что это ваша правильная структура ввода, основанная на вашей логике кода

vendors = [['Company Name      ', ['companyemail@email.com']],
           ['Company Name   ', 
           ['companyemail@email.com','companyemail@email.com']],
           ['Company Name', ['companyemail@email.com']],
           ['Company Name          ', ['companyemail@email.com']]]

def name_filter(vendors):
    unfiltered=vendors
    filtered=[]
    for i in unfiltered:
        print (i)
        filtered.append([i[0].strip(' '), i[1]]) # <--- This is the key line

    return filtered

name_filter(vendors)

# [['Company Name', ['companyemail@email.com']],
#  ['Company Name', ['companyemail@email.com', 'companyemail@email.com']],
#  ['Company Name', ['companyemail@email.com']],
#  ['Company Name', ['companyemail@email.com']]]
1 голос
/ 12 июня 2019
unfiltered = [['Company Name      ', ['companyemail@email.com']], ['Company Name   ', ['companyemail@email.com','companyemail@email.com']], ['Company Name', ['companyemail@email.com']] ,['Company Name          ', ['companyemail@email.com']]]
filtered = []
count=0
text = ''
for i in unfiltered:
    print(i[0])
    test = str((i[0])).strip()
    filtered.append( (str(i)).replace(i[0],test))


print(filtered)


unfiltered = [['Company Name      ', ['companyemail@email.com']], ['Company Name   ', ['companyemail@email.com','companyemail@email.com']], ['Company Name', ['companyemail@email.com']] ,['Company Name          ', ['companyemail@email.com']]]
filtered = []
print(unfiltered)
count=0
text = ''
for i in unfiltered:
    print(i[0])
    test = str((i[0])).strip()
    filtered.append( (str(i)).replace(i[0],test))


print(filtered)
[['Company Name      ', ['companyemail@email.com']], ['Company Name   ', ['companyemail@email.com', 'companyemail@email.com']], ['Company Name', ['companyemail@email.com']], ['Company Name          ', ['companyemail@email.com']]]
Company Name      
Company Name   
Company Name
Company Name          
["['Company Name', ['companyemail@email.com']]", "['Company Name', ['companyemail@email.com', 'companyemail@email.com']]", "['Company Name', ['companyemail@email.com']]", "['Company Name', ['companyemail@email.com']]"]
>>> 
1 голос
/ 12 июня 2019

Я думаю, что вы забыли запятые

unfiltered = [['Company Name      ', ['companyemail@email.com']], ['Company Name   ', ['companyemail@email.com','companyemail@email.com']], ['Company Name', ['companyemail@email.com']] ,['Company Name          ', ['companyemail@email.com']]]
filtered = []
count=0
text = ''
for i in unfiltered:
    print(i[0])
    test = str((i[0])).strip()
    filtered.append( (str(i)).replace(i[0],test))


print(filtered)
1 голос
/ 12 июня 2019

Вы можете сделать это внутри понимания списка:

vendors = [['Company Name      ', ['companyemail@email.com']],
           ['Company Name   ', ['companyemail@email.com','companyemail@email.com']],
           ['Company Name', ['companyemail@email.com']],
           ['Company Name          ', ['companyemail@email.com']]]

vendors = [ [company[0].strip(),*company[1:]] for company in vendors ]

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

...