【问题标题】:Joining two sets of tuples at a common value以共同值连接两组元组
【发布时间】:2018-09-11 00:17:13
【问题描述】:

给定:

setA = [(1, 25), (2, 24), (3, 23), (4, 22), (5, 21), (6, 20), 
         (7, 19), (8, 18), (9, 17), (10, 16), (11, 15), (12, 14), 
         (13, 13),(14, 12), (15, 11), (16, 10), (17, 9), (18, 8), 
         (19, 7),(20, 6), (21, 5), (22, 4), (23, 3), (24, 2), (25, 1)]

setB = [(1, 19), (2, 18), (3, 17), (4, 16), (5, 15), (6, 14), (7, 13),
         (8, 12), (9, 11), (10, 10), (11, 9), (12, 8), (13, 7), (14, 6),
         (15, 5), (16, 4), (17, 3), (18, 2), (19, 1)]

如何使用每个集合中每个元组的第一个元素作为公共键值来组合这两个集合。因此,对于每个集合中位置 1 的元组,它将分别为 (1,25) 和 (1,19)。连接在一起会产生:(25,1,19)

(25,1,19)
(24,2,18)
(23,3,17)
...
(7,19,1)
(6,20,none)
...
(2,24,none)
(1,25,none)

注意:必须保持输出元组的顺序。示例:

(setA value, common value, setB value)
(setA value, common value, setB value)etc...

注意:必须使用 Python 2.7x 标准库

我正在尝试做类似[(a,b,c) for (a,b),(b,c) in zip(setA,setB)] 的事情,但我并不完全理解正确的语法和逻辑。

谢谢。

【问题讨论】:

  • 这里的目标是什么?目前尚不清楚您如何从输入到输出。 “组合”是一个模棱两可的术语。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我已经扩展了解释。
  • 列表中所有元组的第一个元素是否唯一?
  • 另外,他们总是保证像这样单调递增的顺序吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 永远不会有关键元素重复,单位变化的模式将始终保持不变。

标签: python set set-union


【解决方案1】:

您想要的似乎可以像在列表理解内的setB 上进行字典查找一样容易地实现。

mapping = dict(setB)
out = [(b, a, mapping.get(a)) for a, b in setA]

print(out)
[(25, 1, 19),
 (24, 2, 18),
 (23, 3, 17),
 (22, 4, 16),
 (21, 5, 15),
 (20, 6, 14),
 (19, 7, 13),
 (18, 8, 12),
 (17, 9, 11),
 (16, 10, 10),
 (15, 11, 9),
 (14, 12, 8),
 (13, 13, 7),
 (12, 14, 6),
 (11, 15, 5),
 (10, 16, 4),
 (9, 17, 3),
 (8, 18, 2),
 (7, 19, 1),
 (6, 20, None),
 (5, 21, None),
 (4, 22, None),
 (3, 23, None),
 (2, 24, None),
 (1, 25, None)]

【讨论】:

  • @SynchronizeYourDogma 请注意,您的输入有一对额外的大括号,我删除了。此答案假定您的问题没有那个错字。
  • @SynchronizeYourDogma 如果您的数据实际上具有这种荒谬的结构,那么您需要执行setA = setA[0]; setB = setB[0] 并以与以前相同的方式进行。
【解决方案2】:

由于我们的列表大小不同,zip 不是解决方案。

一种解决方案可能是使用itertools 包中的zip_longest 方法。

finalSet = [(b, a, c[1] if c is not None else c) for (a,b), c in zip_longest(*setA,*setB)]

输出

(25, 1, 19)
(24, 2, 18)
(23, 3, 17)
(22, 4, 16)
(21, 5, 15)
(20, 6, 14)
(19, 7, 13)
(18, 8, 12)
(17, 9, 11)
(16, 10, 10)
(15, 11, 9)
(14, 12, 8)
(13, 13, 7)
(12, 14, 6)
(11, 15, 5)
(10, 16, 4)
(9, 17, 3)
(8, 18, 2)
(7, 19, 1)
(6, 20, None)
(5, 21, None)
(4, 22, None)
(3, 23, None)
(2, 24, None)
(1, 25, None)

【讨论】:

    【解决方案3】:
    setA = [(1, 25), (2, 24), (3, 23), (4, 22), (5, 21), (6, 20), 
             (7, 19), (8, 18), (9, 17), (10, 16), (11, 15), (12, 14), 
             (13, 13),(14, 12), (15, 11), (16, 10), (17, 9), (18, 8), 
             (19, 7),(20, 6), (21, 5), (22, 4), (23, 3), (24, 2), (25, 1)]
    
    setB = [(1, 19), (2, 18), (3, 17), (4, 16), (5, 15), (6, 14), (7, 13),
             (8, 12), (9, 11), (10, 10), (11, 9), (12, 8), (13, 7), (14, 6),
             (15, 5), (16, 4), (17, 3), (18, 2), (19, 1)]
    la, lb = len(setA), len(setB)
    temp=[[setA[i][1] if i<la else None, i+1, setB[i][1] if i<lb else None] for i in range(0,max(la,lb))]
    

    [[25, 1, 19],
     [24, 2, 18],
     [23, 3, 17],
     [22, 4, 16],
     [21, 5, 15],
     [20, 6, 14],
     [19, 7, 13],
     [18, 8, 12],
     [17, 9, 11],
     [16, 10, 10],
     [15, 11, 9],
     [14, 12, 8],
     [13, 13, 7],
     [12, 14, 6],
     [11, 15, 5],
     [10, 16, 4],
     [9, 17, 3],
     [8, 18, 2],
     [7, 19, 1],
     [6, 20, None],
     [5, 21, None],
     [4, 22, None],
     [3, 23, None],
     [2, 24, None],
     [1, 25, None]]
    

    【讨论】:

    • 我不确定输入周围的那些额外的大括号是否真的需要。我已经删除了它们,假设这是一个错误(一开始就保留它似乎毫无意义),并相应地编辑了问题。
    • @cᴏʟᴅsᴘᴇᴇᴅ 好的,我给出了相应的修改答案。顺便说一句,你名字中使用的字符是什么?它们很特别。
    【解决方案4】:

    如果您希望 setC 与 setA 和 setB 的格式相同。我认为这种解决方法可以。 直接作为元组输入值是不可能的,因为元组是不可变的,因此我们将新元组附加为列表,然后将其转换为元组。 `

    setC = []
    i=0
    while setA[0][i][0]== setB[0][i][0] and (i < min(len(setA[0]), len(setB[0]))-1):
        setC.append((setA[0][i][1],setA[0][i][0], setB[0][i][1]))
        i+=1
    setC = [tuple(setC)]
    

    `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2015-06-12
      相关资源
      最近更新 更多