将元素添加到 python pyspark 中的列表列表
adding element to a list of list in python pyspark
我有一个包含学生数据结构的列表 - [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2'),.....]
。我使用这个命令得到的这个结构:
student_class = student.map(lambda x:x).zip(class)
现在我想将学生分数添加到上面列表列表的每个元素中,这样输出就变成了:
[('100', 'class 1',score1), ('110', 'class 2',score2), ('1030', 'class 2',score3),.....]
学生的分数显示在名为 score
的列表中。我如何将分数添加到上面的 student_class
列表中以使其成为 student_classScore
列表?
由于您有 list
个 tuple
并且 tuple
是不可变的,因此您需要通过将现有元组与单元素元组集中来创建一个新元组(由 (score,)
创建),然后将新创建的元组附加到新列表。
l = [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2')]
scores = [1, 2, 3]
new_list = []
for tup, score in zip(l, scores):
new_list.append(tup + (score,))
print new_list
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]
另一种但不那么pythonic但概念相同的方法:
for index, tup in enumerate(l):
l[index] = tup + (scores[index],)
print l
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]
由于您使用的是 spark,因此您也可以在 spark 中使用 zip
和 map
来附加分数。
student_RDD = sc.parallelize(['100', '110', '1030'])
class_RDD = sc.parallelize(['class1', 'class2', 'class2'])
score_RDD = sc.parallelize([1, 2, 3])
student_class_RDD = student_RDD.zip(class_RDD) # There is no need to map first
student_class_RDD.zip(score_RDD).map(lambda x: x[0] + (x[1],)).collect()
输出:
[('100', 'class1', 1), ('110', 'class2', 2), ('1030', 'class2', 3)]
我觉得用spark方案比单纯的python方案更合适,尤其是数据量大的时候,这就是你用spark的原因吧?
我有一个包含学生数据结构的列表 - [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2'),.....]
。我使用这个命令得到的这个结构:
student_class = student.map(lambda x:x).zip(class)
现在我想将学生分数添加到上面列表列表的每个元素中,这样输出就变成了:
[('100', 'class 1',score1), ('110', 'class 2',score2), ('1030', 'class 2',score3),.....]
学生的分数显示在名为 score
的列表中。我如何将分数添加到上面的 student_class
列表中以使其成为 student_classScore
列表?
由于您有 list
个 tuple
并且 tuple
是不可变的,因此您需要通过将现有元组与单元素元组集中来创建一个新元组(由 (score,)
创建),然后将新创建的元组附加到新列表。
l = [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2')]
scores = [1, 2, 3]
new_list = []
for tup, score in zip(l, scores):
new_list.append(tup + (score,))
print new_list
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]
另一种但不那么pythonic但概念相同的方法:
for index, tup in enumerate(l):
l[index] = tup + (scores[index],)
print l
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]
由于您使用的是 spark,因此您也可以在 spark 中使用 zip
和 map
来附加分数。
student_RDD = sc.parallelize(['100', '110', '1030'])
class_RDD = sc.parallelize(['class1', 'class2', 'class2'])
score_RDD = sc.parallelize([1, 2, 3])
student_class_RDD = student_RDD.zip(class_RDD) # There is no need to map first
student_class_RDD.zip(score_RDD).map(lambda x: x[0] + (x[1],)).collect()
输出:
[('100', 'class1', 1), ('110', 'class2', 2), ('1030', 'class2', 3)]
我觉得用spark方案比单纯的python方案更合适,尤其是数据量大的时候,这就是你用spark的原因吧?