Понимание списка Python с преобразованием лямбда-функции

#python #lambda #pyspark #list-comprehension

#python #лямбда #pyspark #понимание списка

Вопрос:

Предположим, у меня есть для простоты этот небольшой корпус, состоящий всего из 2 строк.

 'This is first'
'This is second'
 

Чтобы использовать его в моем методе reduceByKey spark, мне нужно иметь следующий вывод:

 [((u'This', u'is'), 1), ((u'is', u'first.'), 1), ((u'This', u'is'), 1), ((u'is', u'second.'), 1)]
 

но с кодом, который я написал ниже, я взял следующий формат (больше списков). Проверьте, что мое решение находится внутри одного «списка», но результат, который я получаю, имеет больше (в зависимости от моего количества слов в предложении)

 [[((u'This', u'is'), 1), ((u'This', u'first.'), 1)], [((u'is', u'first.'), 1)], [((u'This', u'is'), 1), ((u'This', u'second.'), 1)], [((u'is', u'second.'), 1)]]
 

Как можно изменить это, чтобы получить то, что я хочу.

 couples = lines.map(lambda s : s.split(" ")).flatMap(lambda s: [[((s[i],s[j]), 1) for j in range(i 1 , len(s))] for i in range(len(s)-1) ])
 

На случай, если кто-то не знает pyspark, но хороший python, я хочу изменить эту часть:

 lambda s: [[((s[i],s[j]), 1) for j in range(i 1 , len(s))] for i in range(len(s)-1) ]
 

Заранее спасибо

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

1. попробуй: lambda s: [((s[i],s[j]), 1) for i in range(len(s)-1) for j in range(i 1, len(s))]

Ответ №1:

В python нет такого понятия, как расширение возвращаемого значения. Это означает, что вам нужно явно записать возвращаемые значения. Это означает, что лямбда-выражение должно возвращать список. О выравнивании списка нужно позаботиться снаружи. Это может быть реализовано по-разному. Например,

 reduce(lambda a,b: a b, lines.map(...).flatMap(...))