如何将功能应用于字典序列?

时间:2018-11-28 15:06:55

标签: python json python-3.x loops dictionary

我具有以下功能:

def count_chars(e):
    return len(e)

我正在迭代json,如下所示:

在:

a_lis = []
with open('../JSON_FILE.json','r') as fa:
    a = json.load(fa)
    for e in a['entries']:
        pprint(e)

出局:

{'data': ['string'], 'type': 'one'}
{'data': ['a string '], 'type': 'one'}
{'data': ['another string'], 'type': 'three'}
...
{'data': ['one more string'], 'type': 'two'}

如何应用count_chars函数并将其添加或更新为'data'列表中的新字符串?例如,预期的输出将如下所示:

{'data': ['string','6'], 'type': 'one'}
{'data': ['a string','8'], 'type': 'one'}
{'data': ['another string','14'], 'type': 'three'}
...
{'data': ['one more string','15'], 'type': 'two'}

更新

我发现我的列表中有多个项目,例如:['first', 'second string']?如何退回['first', len_1, 'second string', len_2]

2 个答案:

答案 0 :(得分:2)

您可以使用append()

lst = [
    {"data": ["string"], "type": "one"},
    {"data": ["a string "], "type": "one"},
    {"data": ["another string"], "type": "three"},
]

def count_chars(e):
    return len(e)

for d in lst:
    d["data"].append(count_chars(d["data"][0]))

print(lst)
# [{'data': ['string', 6], 'type': 'one'}, {'data': ['a string ', 9], 'type': 'one'}, {'data': ['another string', 14], 'type': 'three'}]

如果列表中有更多字符串,则可以使用extend()并重建一个新列表:

lst = [
    {"data": ["string", "hi"], "type": "one"},
    {"data": ["a string "], "type": "one"},
    {"data": ["another string"], "type": "three"},
]

def count_chars(e):
    return len(e)

for d in lst:
    newlst = []
    for x in d["data"]:
        newlst.extend([x, count_chars(x)])
    d["data"] = newlst

print(lst)
# [{'data': ['string', 6, 'hi', 2], 'type': 'one'}, {'data': ['a string ', 9], 'type': 'one'}, {'data': ['another string', 14], 'type': 'three'}]

注意:由于count_chars()仅返回len(),因此仅调用len()本身可能会更容易。

答案 1 :(得分:2)

应该可以:)

def count_chars(e):
    return len(e)

a_lis = []
with open('../JSON_FILE.json','r') as fa:
    a = json.load(fa)
    for e in a['entries']:
        for String in e["data"]: # Grab one string inside the strings list.
            if type(String) == int:
                continue # Skip the count chars value that you appended.
            Length = count_chars(String) # Apply the function.
            e["data"].append(Length) # Append the returned value to the data list containing the string.

        # Now we reorder the list from ["a", "ab", "abc", 1, 2, 3] to ["a", 1, "ab", 2, "abc", 3]
        strings_found = int(len(e["data"])/2)
        reordered_list = []

        for start in range(0, strings):
            reordered_list = reordered_list + [x for x in e["data"][start::strings_found ]]
        e["data"] = reordered_list