2017-09-24 32 views
0

我不明白为什么列表不会附加在pyspark。有人可以帮我看看我的代码吗?如果else语句在for循环附加到列表

import json 

input_file = sc.textFile("data.json") 

def extract_func(data): 
    c_list = [] 
    neighborhoods = data.get('neighborhoods', None) 

    for n in neighborhoods: 
     if n == []: 
      c_list.append('Unknown') 
     else: 
      c_list.append(n) 

    return c_list 

实例数据录入:

{'attributes': {'Accepts Credit Cards': True, 
'city': 'Edinburgh', 
'name': 'Conan Doyle', 
'neighborhoods': [], 
'stars': 3.5, 
'state': 'EDH'}} 

这个例子项不都表现出了社区,所以我想追加“未知”的名单。其他一些数据项有多个邻域,所以我想通过for循环逐个追加它们。

当我运行dat = input_file.map(lambda line: json.loads(line))后跟dat = dat.flatMap(extract_func),它不会给我Unknown邻域条目。

正在检查几小时,无法弄清楚什么是错,我在这里错过了什么?

+0

你能解释一下你所说的“列表中没有追加”是什么意思?什么应该附加到什么?你正在调用'data.get()',但数据没有被定义。数据应该是什么?你指的是什么'dat'变量? – charlesreid1

+0

如果'n'正在迭代字典,它将被设置为字典的键值,而不是值。 –

+0

在你的'data'中,''neighborhoods'是'attributes'的子键,所以你必须先从它得到第一个和''neighborhoods'。 –

回答

1

if n == []:将只能达到和评价True如果neighborhoods包含一个空列表,而不是在它的本身是空的。您可以简化代码:

neighborhoods = data.get("neighborhoods") 
if neighborhoods: 
    c_list = ["Unknown" if n == [] else n for n in neighborhoods] 
else: 
    c_list = ["Unknown"] 

,或者使用条件表达式:

c_list = (["Unknown" if n == [] else n for n in neighborhoods] if neighborhoods 
      else ["Unknown"]) 
+1

谢谢你指出空列表问题!这正是我卡住的地方。 –