понимания списка Python; сжатие списка списков?

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

extension UITableView {

    func scrollToTop(){

        for index in 0...numberOfSections - 1 {
            if numberOfSections > 0 && numberOfRows(inSection: index) > 0 {
                scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true)
                break
            }

            if index == numberOfSections - 1 {
                setContentOffset(.zero, animated: true)
                break
            }
        }

    }

}
67
задан Steve Cooper 2 July 2009 в 22:40
поделиться

8 ответов

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

[filename for path in dirs for filename in os.listdir(path)]
99
ответ дан 24 November 2019 в 14:23
поделиться

Вы могли бы просто сделать все напрямую:

subs = []
for d in dirs:
    subs.extend(os.listdir(d))
16
ответ дан 24 November 2019 в 14:23
поделиться

Вы можете найти хороший ответ в рецептах itertools:

def flatten(listOfLists):
    return list(chain.from_iterable(listOfLists))

(Примечание: требуется Python 2.6 +)

50
ответ дан 24 November 2019 в 14:23
поделиться
subs = []
map(subs.extend, (os.listdir(d) for d in dirs))

(но ответ Муравья лучше; +1 за него)

7
ответ дан 24 November 2019 в 14:23
поделиться

Вы можете объединить списки с помощью обычного оператора сложения:

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]

Встроенная функция sum добавит числа в последовательность и может, при желании, начать с определенного значения. :

>>> sum(xrange(10), 100)
145

Объедините приведенное выше, чтобы сгладить список списков:

>>> sum([[1, 2], [3, 4]], [])
[1, 2, 3, 4]

Теперь вы можете определить свою плоскую карту :

>>> def flatmap(f, seq):
...   return sum([f(s) for s in seq], [])
... 
>>> flatmap(range, [1,2,3])
[0, 0, 1, 0, 1, 2]

Изменить: Я только что видел критику в комментариях к другой ответ , и я думаю, это правильно, что Python без нужды будет создавать и собирать мусор с помощью этого решения. Лучшее, что можно сказать об этом, - это то, что это очень просто и лаконично, если вы привыкли к функциональному программированию: -)

11
ответ дан 24 November 2019 в 14:23
поделиться

Вы можете попробовать itertools.chain () , например:

import itertools
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = list(itertools.chain(*[os.listdir(d) for d in dirs]))
print subs

itertools.chain () возвращает итератор, следовательно, переход к list () .

4
ответ дан 24 November 2019 в 14:23
поделиться

Google предложил мне следующее решение:

def flatten(l):
   if isinstance(l,list):
      return sum(map(flatten,l))
   else:
      return l
3
ответ дан 24 November 2019 в 14:23
поделиться

Я начну с предположения, что и .NET, и Java имеют большие и эквивалентные поддерживающие инфраструктуры, API и т.д. Вы обладаете обширными знаниями .Net и должны изучить Java-эквиваленты некоторых подмножеств, чтобы реализовать их в Java.

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

Поэтому я думаю, что один большой вопрос - это размер вашего учебного следа CMS. Я думаю, что CMS очень много о логике и структуры данных и, вероятно, только использует небольшой набор Java API - сеть и файл io, или базы данных, может быть? Любой пользовательский интерфейс может быть нейтральным для платформы Javascript/AJAX, возможно?

Основной альтернативой кажется Mono. Я не могу говорить с практиками работы под Моно, я предполагаю, что это вполне нормально. Например, поддерживается ли iSeries? Для тебя это имеет значение?

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

-121--4055883-

Для чего-либо, кроме базовых операций GET, встроенные функции java.net HTTP не очень хороши. Для этого рекомендуется использовать Apache Commons (Клиент) . Это позволяет вам делать гораздо более интуитивные вещи, такие как:

PutMethod put = new PutMethod(url);
put.setRequestEntity(new FileRequestEntity(localFile, contentType));
int responseCode = put.executeMethod();

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

-121--2639086-
>>> listOfLists = [[1, 2],[3, 4, 5], [6]]
>>> reduce(list.__add__, listOfLists)
[1, 2, 3, 4, 5, 6]

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

66
ответ дан 24 November 2019 в 14:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: