Python список списков в зависимости от длины - PullRequest
0 голосов
/ 10 января 2019

У меня есть списки ниже, и мне нужно назначить строки из списка фруктов в список киосков в зависимости от их длины.

fruit = ['an', 'king', 'be', 'brave']
stall = [[],[],[],[]]

Таким образом, результат должен быть таким

stall = [[ ],['an', 'be'],[ ],['king', 'brave']] 

Я пробовал так много способов и даже пытался создать новый список, чтобы увидеть, где я иду не так, но даже это ничего не заполняет. Может кто-нибудь указать мне, где я иду не так? Мне никогда раньше не приходилось добавлять в список списков.

i = 0
s = stall[i]
for j in fruit:
    if(len(j)) == i+1:
        s.append(j)
        i += 1
print(stall)

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Один путь может быть следующим. Сначала вы получаете размер пустого списка stall по размерам самой большой строки в вашем fruit. Затем вы просто добавляете фрукты в соответствующую позицию в своих вложенных списках.

len(f)-1 используется, потому что индексация в python начинается с 0.

fruit = ['an', 'king', 'be', 'brave']
stall = [[] for _ in range(len(max(fruit, key=len)))]

for f in fruit:
    stall[len(f)-1].append(f)

print (stall)
# [[], ['an', 'be'], [], ['king'], ['brave']]
0 голосов
/ 10 января 2019

Простой O (n) подход:

fruit = ['an', 'king', 'be', 'brave']

lookup = {}
for word in fruit:
    lookup.setdefault(len(word), []).append(word)

stall = [lookup.get(i, []) for i in range(1, max(lookup) + 1)]

print(stall)

Альтернативный вариант использования defaultdict :

from collections import defaultdict

fruit = ['an', 'king', 'be', 'brave']

lookup = defaultdict(list)
for word in fruit:
    lookup[len(word)].append(word)

stall = [lookup.get(i, []) for i in range(1, max(lookup) + 1)]

print(stall)

Выход

[[], ['an', 'be'], [], ['king'], ['brave']]
0 голосов
/ 10 января 2019

Я не уверен, что классификация король и храбрый вместе, как это делает ваш вопрос, была преднамеренной или нет. Я предполагаю, что умышленно.

fruit = ['an', 'king', 'be', 'brave']
stall = [[],[],[],[]]
for f in fruit:
        stall[min(len(f),4)-1].append(f)

Это даст вам

>>> stall
[[], ['an', 'be'], [], ['king', 'brave']]
0 голосов
/ 10 января 2019

Предполагая, что вы хотите столько внутренних списков, сколько вам нужно, чтобы правильно ввести все слова:

fruit = ['an', 'king', 'be', 'brave']

stall = [
    [element for element in fruit if len(element) == i+1]
    for i in range(len(fruit) + 1)
]

stall теперь будет [[], ['an', 'be'], [], ['king'], ['brave']].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...