【问题标题】:Manipulating each item (string) in a list, within a list, within a list操作列表中、列表中、列表中的每个项目(字符串)
【发布时间】:2018-12-01 19:30:53
【问题描述】:

*在 Windows 上的 Python 3.6.4 上使用 python 3

twoDlist = [
    [] * len(pathology_case_retrieval_report[1:])
    for x in range(len(pathology_case_retrieval_report[1:]))
]

这是我的长度为 67 的列表。

for i in range(len(twoDlist)):
    temp = twoDlist[i]
    temp.append(SPnumsList[i])
    temp.append(requested_ByList[i])
    temp.append(dateTimelist1[i])
    twoDlist[i] = temp

这就是我将每个列表(SPnumsListrequested_ByListdateTimelist1)中的每个项目附加到较大列表(twoDlist)中的每个列表的方式。

twoDlist 中的示例元素:

['Number', 'Physician Name', ['stringN']]

*请注意,该列表的第二个索引内部可以包含 0 到 n 个元素,我想说明这一点。

我需要执行字符串操作(通过第二个索引中每个元素的正则表达式(特别是re.sub(r'[A-Za-z.\'\"\,\n;:]', '', stringN))。 然后将新项目附加回列表的第二个索引,替换旧字符串。

我还想: 将每个stringN 元素放入

['123', 'Dr. Bob', ['string1','string2', 'string3']]

并将其附加到新列表中,同时保留 'Number''Physician Name'

我希望我的数据看起来如何的示例:

[
    ['123', 'Dr. Bob', 'string1'],
    ['123', 'Dr. Bob', 'string2'],
    ['123', 'Dr. Bob', 'string3'],
    # ...
]

对于twoDlist 中的每个['Number', 'Physician Name', ['stringN']]

提前谢谢你!

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以非常简洁地使用reduce (docs here) 将每个记录拆分为索引 2 处字符串列表中的每个字符串的多个记录。在每次迭代中,您还可以执行正则表达式替换。

    这是一个例子:

    import re
    from functools import reduce
    
    twoDlist = [
        ['123', 'Dr. Bob', ['string1','string2', 'string3']],
        ['456', 'Dr. Jim', ['string4','string5', 'string6']],
    ]
    
    regex = r'[A-Za-z.\'\"\,\n;:]'
    
    final = reduce(
        lambda a, sublist: a + [[*sublist[:2], re.sub(regex, "", st)] for st in sublist[2]],
        twoDlist,
        []
    )
    

    reduce 迭代 twoDlist 并且 twoDlist 的每个元素 (sublist) 使用列表推导转换为列表列表(索引 2 处列表的每个元素对应一个列表)。然后将这些新列表全部追加到目前处理的列表中。

    结果是final 为:

    [
        ['123', 'Dr. Bob', '1'],
        ['123', 'Dr. Bob', '2'],
        ['123', 'Dr. Bob', '3'],
        ['456', 'Dr. Jim', '4'],
        ['456', 'Dr. Jim', '5'],
        ['456', 'Dr. Jim', '6']
    ]
    

    【讨论】:

    • 感谢亨利·伍迪。有效。我需要更加熟悉 reduce 函数!
    • @UwadiaEdomwonyi 在这里查看reduce 上的文档:docs.python.org/3/library/functools.html#functools.reduce 这是一个非常强大的功能,可以以多种不同方式使用
    • lambda 函数有两个参数:a 和 sublist。我知道子列表是指 twoDlist 中的列表元素。 “一”指的是什么?谢谢
    • @UwadiaEdomwonyi a 是迄今为止的总数。在第一次迭代中,a 采用给定的初始值(reduce 的最后一个参数)[]。对于每个连续迭代,a 等于上一次迭代的 lambda 函数的返回值。另请注意,第一个参数不必是 lambda 函数,它可以是任何函数,但经常使用 lambdas,因为这些通常是一次性函数
    • 我一直在阅读有关 reduce 函数的文档...空列表是否会被视为初始化程序?
    【解决方案2】:

    给定

    twoDlist = [['123', 'Dr. Bob', ['string1','string2', 'string3']], ['345', 'Dr. Joe', ['string4', 'string5']]]
    

    你可以发出

    >>> [[[*sub[:-1], x] for x in sub[-1]] for sub in twoDlist]
    [[['123', 'Dr. Bob', 'string1'],
      ['123', 'Dr. Bob', 'string2'],
      ['123', 'Dr. Bob', 'string3']],
     [['345', 'Dr. Joe', 'string4'],
      ['345', 'Dr. Joe', 'string5']]]
    

    如果您还想删除一层嵌套,可以使用itertools.chain.from_iterable

    >>> tmp = ([[*sub[:-1], x] for x in sub[-1]] for sub in twoDlist)
    >>> list(chain.from_iterable(tmp))
    [['123', 'Dr. Bob', 'string1'],
     ['123', 'Dr. Bob', 'string2'],
     ['123', 'Dr. Bob', 'string3'],
     ['345', 'Dr. Joe', 'string4'],
     ['345', 'Dr. Joe', 'string5']]
    

    【讨论】:

    • 谢谢 timgeb!
    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2015-05-15
    • 2017-09-03
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多