Понимание списка — разделение элемента списка по размеру элемента, Python 3.6

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

У меня есть приведенный ниже список, я хочу разделить его, если размер элемента списка > 2, как отдельный элемент, а если размер меньше 2, то как подсписок. Я написал приведенный ниже скрипт и он работает. Но как добиться понимания списка с помощью любого лямбда-выражения.

 My_List = ['ABC', 'A', 'AB', 'ABCD']

New_Chunks = []
New_Chunks2 = []
for Item in My_List:
    if len(Item) > 2:
        New_Chunks.append(Item)
    else:
        New_Chunks2.append(Item)

New_Chunks.append(New_Chunks2)

Result: ['ABC', 'ABCD', ['A', 'AB']]
  

Комментарии:

1. Понимание списка не подходит для добавления в несколько разных списков одновременно, и lambda сами по себе они не будут полезны, если они не сопряжены с таким инструментом, как map (хотя это было бы злоупотреблением map ). Может быть, itertool который может использовать lambda , чтобы помочь здесь, но я не могу придумать ни одного из них с самого начала.

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

3. Если вы действительно хотите, вы можете: a = [item for item in My_List if len(item) > 2] b = [item for item in My_List if len(item) <= 2] a.append(b)

4. @OrY Это требует много дополнительной работы (повторение списка дважды, вычисление длины каждого элемента дважды) без существенной выгоды.

5. Может быть, как это ? Хотя он не использует ни один из инструментов, которые вы хотите, и выигрыш минимален, если таковой имеется. @ OrY Проблема в том, что для выполнения этого требуется две итерации My_List .

Ответ №1:

Ваш код подходит для этого случая, если вы действительно хотите сделать его короче, вы можете сделать что-то вроде

 My_List = ['ABC', 'A', 'AB', 'ABCD']

New_Chunks = []
New_Chunks2 = []
# or in one line New_Chunks, New_Chunks2 = [], []
for Item in My_List:
    (New_Chunks2, New_Chunks)[len(Item) > 2].append(Item)
# or do it in one line as [(New_Chunks2, New_Chunks)[len(Item) > 2].append(Item) for Item in My_List]

New_Chunks.append(New_Chunks2)

  

Результат: ['ABC', 'ABCD', ['A', 'AB']]

но ваш более удобочитаемый

Еще короче

Я просто развлекаюсь здесь, пожалуйста, не делайте этого

 My_List = ['ABC', 'A', 'AB', 'ABCD']

New_Chunks2 = []
New_Chunks = [New_Chunks2]
[(New_Chunks2, New_Chunks)[len(Item) > 2].append(Item) for Item in My_List]

  

Результат: [['A', 'AB'], 'ABC', 'ABCD']

Комментарии:

1. @Jimmer, спасибо за попытку

Ответ №2:

Вы можете сделать это:

 my_list = ['ABC', 'A', 'AB', 'ABCD']
number_list1 = []
number_list2 = []
[number_list1.append(x) if len(x) > 2 else number_list2.append(x) for x in my_list] 
number_list1.append(number_list2)
print(number_list1)
  

Вывод:

 ['ABC', 'ABCD', ['A', 'AB']]
  

Или это:

 my_list = ['ABC', 'A', 'AB', 'ABCD']
number_list = [x for x in my_list if len(x) > 2 ]
number_list2 = [x for x in my_list if len(x) <= 2 ]
number_list.append(number_list2)
  

Вывод:

 ['ABC', 'ABCD', ['A', 'AB']]
  

Комментарии:

1. В этом случае в список не будет добавлено ни одного объекта, результатом будет ['ABC', None, None, 'ABCD', ['A', 'AB']]