python - 根据列表项第一个元素的邻接性合并列表项

标签 python python-3.x list dictionary tuples

我有一个类似的列表:

temp_list = [(18, [2773]), (57, [87]), (98, [34]), (135, [5]), (140, [56]), (164, [2151]), (165, [2194, 2101, 2049]), (166, [2298, 2244, 2004]), (167, [2343]), (236, [2752]), (245, [636]), (250, [2290, 2241, 2194, 2146, 2098, 2050, 2001]), (251, [2337, 1952]), (252, [1905, 1857]), (253, [1809]), (254, [1760, 1713, 1661]), (255, [1614]), (256, [1717, 1564, 1522]), (284, [2773]), (303, [2744]), (339, [1842]), (340, [560]), (341, [945]), (342, [1026, 975, 875, 854, 833, 783]), (343, [1093]), (344, [1601, 1477, 1440, 1384, 1362, 1327, 1298, 1237, 1203, 1181, 1130]), (413, [972, 924, 880, 787]), (414, [1067, 1019, 834]), (415, [1299, 1160, 1114]), (416, [1253, 1207]), (487, [555, 491]), (488, [459]), (489, [522]), (490, [2130, 2092, 1791, 1752, 1589]), (491, [2243, 2206, 2168, 2053, 1870, 1831, 1713, 1635, 1513, 1476]), (492, [2358, 2321, 2283, 1673, 1551]), (569, [2046, 1981, 1956]), (570, [2137, 2111, 2073, 2019, 1922]), (619, [535]), (621, [684]), (623, [979]), (624, [1110, 613]), (625, [2060]), (626, [1774]), (690, [1824, 1771, 1721]), (691, [1926, 1902, 1849, 1798, 1746, 1694]), (700, [2743]), (893, [421]), (894, [650, 602, 556, 510, 466]), (895, [746, 697]), (896, [1160]), (898, [524, 479, 435]), (899, [760, 717, 665, 615, 568]), (925, [1273]), (932, [1087]), (936, [1127]), (964, [700, 604, 558]), (965, [2775, 747, 649]), (1018, [2785]), (1039, [426])]

我想连续检查列表的元组项中的第一项是否相邻,如果相邻,则合并元组的第二项(这是一个列表)并将它们全部添加到另一个列表中,并分配给键 。

为了简化,我们从元组的第一项开始检查列表中的 18,并检查紧邻的下一个 57,如 (18+2 >= 57)False,我们在另一个字典中指定 18 作为键,[2773] 作为值。

现在从第一项为 164 的元组开始,下一个元组的第一项 165 满足 (164+2>=165),我们继续到第一项为 166 的下一个元组,它也满足邻接条件,与第一项为 167 的下一个元组相同,但第一项为 166 的下一个元组 236 不满足邻接条件,因为 (167+2 >= 236) == False。因此,我们将元组中从 [2151][2343] 的所有第二项添加到新列表中,并分配给具有最低值 164 的键.

我已经尝试过这段代码:

# First Loop Part
a = []
b = []
for i in temp_list[:-1]:
    if temp_list[temp_list.index(i)+1][0] - i[0] >= 2:
        a.append(i[0])
        b.append(temp_list[temp_list.index(i)+1][0])
c = {}
# Second Loop Part
for i in range(len(a)-1):
    k = []
    for l in temp_list:
        if l[0] == a[i]:
            ts = temp_list.index(l)
    for l in temp_list:
        if l[0] == a[i+1]:
            te = temp_list.index(l)
    for j in temp_list[ts : te]:
        k.append(j[1])
    k = [item for sublist in k for item in sublist]
    c[a[i]] = k

我有

a = [18, 57, 98, 135, 140, 167, 236, 245, 256, 284, 303, 344, 416, 492, 570, 619, 621, 626, 691, 700, 896, 899, 925, 932, 936, 965, 1018] 

b = [57, 98, 135, 140, 164, 236, 245, 250, 284, 303, 339, 413, 487, 569, 619, 621, 623, 690, 700, 893, 898, 925, 932, 936, 964, 1018, 1039]

这两个列表都不符​​合要求。按照逻辑,列表应该是:

[18, 57, 98, 135, 140, 164, 236, 245, 250, 284, 303, 339, 413, 487, 569, 619, 690, 700, 893, 925, 932, 936, 964, 1018, 1039]

但是,为字典部分中的键赋值的工作完成得正确。我得到了

c = {18: [2773], 57: [87], 98: [34], 135: [5], 140: [56, 2151, 2194, 2101, 2049, 2298, 2244, 2004], 167: [2343], 236: [2752], 245: [636, 2290, 2241, 2194, 2146, 2098, 2050, 2001, 2337, 1952, 1905, 1857, 1809, 1760, 1713, 1661, 1614], 256: [1717, 1564, 1522], 284: [2773], 303: [2744, 1842, 560, 945, 1026, 975, 875, 854, 833, 783, 1093], 344: [1601, 1477, 1440, 1384, 1362, 1327, 1298, 1237, 1203, 1181, 1130, 972, 924, 880, 787, 1067, 1019, 834, 1299, 1160, 1114], 416: [1253, 1207, 555, 491, 459, 522, 2130, 2092, 1791, 1752, 1589, 2243, 2206, 2168, 2053, 1870, 1831, 1713, 1635, 1513, 1476], 492: [2358, 2321, 2283, 1673, 1551, 2046, 1981, 1956], 570: [2137, 2111, 2073, 2019, 1922], 619: [535], 621: [684, 979, 1110, 613, 2060], 626: [1774, 1824, 1771, 1721], 691: [1926, 1902, 1849, 1798, 1746, 1694], 700: [2743, 421, 650, 602, 556, 510, 466, 746, 697], 896: [1160, 524, 479, 435], 899: [760, 717, 665, 615, 568], 925: [1273], 932: [1087], 936: [1127, 700, 604, 558], 965: [2775, 747, 649]}

实现邻接列表项逻辑的正确方法是什么?对第一个循环部分的任何帮助都会有很大帮助,因为如果我们正确获取第一个列表(a 或 b),第二个循环部分将正常工作。

最佳答案

您可以通过将列表与自身压缩(偏移量为 1)来配对相邻元组,将元组附加到临时列表 c(如果它与最后一个元组不相邻),或者扩展列表在最后一个元组中(如果相邻),并使用结果元组列表实例化一个字典:

c = []
for (a, _), (b, l) in zip([(None, [])] + temp_list, temp_list):
    if a is None or b - a >= 2:
        c.append((b, l))
    else:
        c[-1][1].extend(l)

这样 dict(c) 就变成:

{18: [2773], 57: [87], 98: [34], 135: [5], 140: [56], 164: [2151, 2194, 2101, 2049, 2298, 2244, 2004, 2343], 236: [2752], 245: [636], 250: [2290, 2241, 2194, 2146, 2098, 2050, 2001, 2337, 1952, 1905, 1857, 1809, 1760, 1713, 1661, 1614, 1717, 1564, 1522], 284: [2773], 303: [2744], 339: [1842, 560, 945, 1026, 975, 875, 854, 833, 783, 1093, 1601, 1477, 1440, 1384, 1362, 1327, 1298, 1237, 1203, 1181, 1130], 413: [972, 924, 880, 787, 1067, 1019, 834, 1299, 1160, 1114, 1253, 1207], 487: [555, 491, 459, 522, 2130, 2092, 1791, 1752, 1589, 2243, 2206, 2168, 2053, 1870, 1831, 1713, 1635, 1513, 1476, 2358, 2321, 2283, 1673, 1551], 569: [2046, 1981, 1956, 2137, 2111, 2073, 2019, 1922], 619: [535], 621: [684], 623: [979, 1110, 613, 2060, 1774], 690: [1824, 1771, 1721, 1926, 1902, 1849, 1798, 1746, 1694], 700: [2743], 893: [421, 650, 602, 556, 510, 466, 746, 697, 1160], 898: [524, 479, 435, 760, 717, 665, 615, 568], 925: [1273], 932: [1087], 936: [1127], 964: [700, 604, 558, 2775, 747, 649], 1018: [2785], 1039: [426]}

关于python - 根据列表项第一个元素的邻接性合并列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54808646/

相关文章:

python - tf.constant 与 tf.placeholder

Python正则表达式将分割符之前的文本和整个文本之后的文本分组?

python - 在另一个函数中调用一个函数的结果

python - 如何获得完美的音频时序

python - 有没有办法将剪贴板内容转换为Python运行中的列表?

javascript - 使用 Javascript 检索二进制文件内容,base64 对其进行编码并使用 Python 对其进行反向解码

Python pandas select条件为什么要像frame[frame ['col1'].notna()]一样写两次dataframe名称?

python-3.x - Python : Spacy and memory consumption

Java:如何根据文件创建数组列表

regex - 如何使用 strsplit() 访问 R 列表中的元素?