【问题标题】:array and string manipulation数组和字符串操作
【发布时间】:2017-12-05 18:52:09
【问题描述】:

我有两个数组:(arrayA 包含整数,arrayB 和 arrayC 包含字符串)

arrayA = [5, 4]
arrayB = ["id_1", "id_2"] #arrayA and arrayB always have same lengths 
arrayC = ['3', '4', '15', '20', '23', '8', '11', '14', '21']

我想要结果:

res = {"id_1": ['3', '4', '15', '20', '23'], 
       "id_2": ['8', '11', '14', '21']}

所以基本上我想告诉程序 arrayB 的 id_1 包含前 5 个字符串,而 arrayB 的 id_2 包含接下来的 4 个字符串。

类似以下问题的结果是:

A = [2, 1, 3, 4]
B = ["a", "b", "c", "d"]
C = ['23', '8', '11', '3', '4', '15', '20', '23', '100', '45'] 

res = {"a": ['23', '8'], 
       "b": ['11'],
       "c": ['3', '4', '15'], 
       "d": ['20', '23', '100', '45']}

【问题讨论】:

    标签: arrays string python-2.7 python-3.x


    【解决方案1】:

    您可以根据A 提供的长度,使用itertools.islice 剥离C 的部分。为此,您还需要将 C 设为迭代器,以便切片从最后一个切片停止的位置开始:

    import itertools as IT
    A = [2, 1, 3, 4]
    B = ["a", "b", "c", "d"]
    C = ['23', '8', '11', '3', '4', '15', '20', '23', '100', '45'] 
    C = iter(C)
    result = {bi: list(IT.islice(C, ai)) for ai, bi in zip(A, B)}
    print(result)
    

    产量

    {'b': ['11'], 
     'c': ['3', '4', '15'], 
     'd': ['20', '23', '100', '45'], 
     'a': ['23', '8']}
    

    【讨论】:

    • 非常感谢,但我以前从未使用过 itertools。你能解释一下每一行代码吗?
    • 你的问题太宽泛了,因为我不知道你已经知道多少。如果关于这条线的一切都是一个谜,那么从阅读tutorial 开始,尤其是list comprehensionsdictionarieszipislice。如果您有更具体的问题,我很乐意解释。
    • 非常感谢您提供参考!如果我还有其他问题,我一定会查找并询问您!
    【解决方案2】:

    你可以试试:

    A = [2, 1, 3, 4]
    B = ["a", "b", "c", "d"]
    C = ['23', '8', '11', '3', '4', '15', '20', '23', '100', '45'] 
    
    
    res = {}
    ix = 0
    for k, l in zip(B, A):
        res[k] = C[ix:(ix+l)]
        ix += l
    
    print(res)
    
    # {'a': ['23', '8'], 'b': ['11'], 'c': ['3', '4', '15'], 'd': ['20', '23', '100', '45']}
    

    解决方案如下:

    首先,我们创建一个名为res 的字典来跟踪结果。然后,我们创建一个名为 ix 的变量并将其设置为 0。该变量帮助我们跟踪数组 C 的索引位置,以便为我们的结果字典获取所需的值。此外,我们zip 数组BA。这个压缩过程相当于从BA 创建一个新的元组列表,看起来像[("a", 2), ("b", 1), ("c", 3), ("d", 4)]。现在您已经有了这个压缩容器,我们使用 for-loop 进行迭代;因此for k, l in zip(B, A) 部分。随后,在每次迭代中,我们将数组 Cix 切片到 ix + l;其中l 是数组A 中对应的整数值。此切片操作的值保存在我们的 res 字典中,其中的键来自数组 B。最后,我们将ix 的值增加l 的值,以确保我们制作的下一个切片通过数组C 向前移动。

    我希望这会有所帮助。

    【讨论】:

    • 谢谢你。你能解释一下代码吗? for 循环中发生了什么以及 zip 函数是什么?
    • 这个解释得非常漂亮和彻底!太感谢了!我从来没有使用过包含多个变量的循环,但现在我有了,它让生活变得更加轻松!谢谢!
    猜你喜欢
    • 2018-04-02
    • 2018-07-14
    • 2015-01-19
    • 2012-03-25
    • 2011-03-22
    • 2016-12-03
    • 2015-06-29
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多