#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(...))