递归修改具有不规则形状的列表

时间:2018-05-11 17:19:50

标签: python list

aa列表是我的输入,bb列出了我想要的输出。操作相当简单(将aa中的每个元素更改为字符串,附加一些字符,同时保持原始形状),但我这样做的方式似乎不必要地复杂。

有更好的(更多Pythonic)方法吗?

aa = [0, 5, 6, [8], 3, [9, 2]]

bb = []
for e1 in aa:
    if type(e1) == list:
        bb2 = []
        for e2 in e1:
            bb2.append('sss' + str(e2))
        bb.append(bb2)
    else:
        bb.append('sss' + str(e1))

print(bb)
['sss0', 'sss5', 'sss6', ['sss8'], 'sss3', ['sss9', 'sss2']]

3 个答案:

答案 0 :(得分:7)

您可以使用递归列表推导来实现此目的

def f(data):
    return [f(i) if isinstance(i, list) else 'sss{}'.format(i) for i in data]

例如

>>> aa = [0, 5, 6, [8], 3, [9, 2]]
>>> f(aa)
['sss0', 'sss5', 'sss6', ['sss8'], 'sss3', ['sss9', 'sss2']]

答案 1 :(得分:1)

您可以执行您的问题标题已经暗示的内容,即使用递归:

spec:
  containers:
  - name: my-service
    env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /etc/gcp/application-credentials.json

答案 2 :(得分:1)

嗯,递归地做一个更简洁的方法是

def addSSS(item):
    if isinstance(item, list):
        # map takes a function, and a list and returns a 
        # new list that is the result of applying the function 
        # to each element. list() converts the result to a list
        return list(map(addSSS, item))

    # if it's not a list simply append the string and return that value
    return "sss" + str(item)

bb = list(map(addSSS, aa))

地图很不错,因为他们不会立即评估每个元素,只是在需要时,当然在这里,当您致电list()将其转回列表时,会立即对其进行评估

这样做还有一个额外的好处,就是当你的列表比aa = [1, 2, [1, 2, [1, 2]]]

更深入时,它会起作用