根据列表项第一个元素的相邻性合并列表项

时间:2019-02-21 13:50:00

标签: 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])]

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

为简化起见,我们从元组的第一项中检查列表中的18,然后检查紧接的下一个57,因为(18+2 >= 57)False,所以我们分配18作为键,[2773]作为另一个字典中的值。

现在从第一个项为164的元组开始,下一个元组的第一个项165满足(164+2>=165),我们继续到第一个项为{{1}的下一个元组},它也满足邻接条件,与具有第一项166的下一个元组相同,但具有第一项167的下一个元组没有像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]

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

1 个答案:

答案 0 :(得分:3)

您可以通过以下方式将相邻的元组配对,方法是将列表自身以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]}
相关问题