【问题标题】:Picking two samples from a list based on condition根据条件从列表中选取两个样本
【发布时间】:2023-02-24 01:34:04
【问题描述】:

下面是列表说my_listmy_list 的最大项目或最大长度可以是 100 万。

[
    ['N1', 'C1'], 
    ['N2', 'C2'], 
    ['N3', 'C1'], 
    ['N4', 'C1'], 
    ['N5', 'C1'], 
    ['N6', 'C2'], 
    ['N7', 'C1']
]

我想从此列表中选择两个示例,其中第一个具有C1,第二个具有C2

输出可能是:

N1 和 N2

或者

N2 和 N1

或者

N6 和 N7

我以前在列表中使用过random.sample(),但在这种情况下,我不确定如何应用条件,因为列表元素由, 分隔。

任何建议/帮助都会很棒。

【问题讨论】:

  • 该条件仅适用于子列表的第 2 项?
  • 你有多少个 C1 和 C2 项目?它们是大致相等的还是你拥有的一个比另一个多很多?您只需要为列表执行一次还是多次?
  • 你能解释一下为什么输出不能是 N7 和 N6 吗?
  • 是的,选择两个第一项样本 - 一个的第二项是C,另一个的第二项是C2
  • @nonlinear 没错。输出可以是 N7 和 N6。我已经更新了问题。谢谢。

标签: python


【解决方案1】:

使用random.choice

def pick_samples(all_choices):
    a = random.choice(all_choices)
    while True:
        b = random.choice(all_choices)
        if b[1] != a[1]:
            break
    return a[0], b[0]

【讨论】:

    【解决方案2】:

    如果你想获得所有可能发生这种情况的情况,你可以使用itertools.combinations 来获得两个项目的所有唯一组合,然后根据条件过滤项目。

    import itertools
    
    my_list = [
        ['N1', 'C1'],
        ['N2', 'C2'],
        ['N3', 'C1'],
        ['N4', 'C1'],
        ['N5', 'C1'],
        ['N6', 'C2'],
        ['N7', 'C1']
    ]
    
    pairs = [
        (v1, v2)
        for v1, v2 in itertools.combinations(my_list, r=2)
        if {v1[1], v2[1]} == {"C1", "C2"}
    ]
    
    for pair in pairs:
        print(pair)
    
    (['N1', 'C1'], ['N2', 'C2'])
    (['N1', 'C1'], ['N6', 'C2'])
    (['N2', 'C2'], ['N3', 'C1'])
    (['N2', 'C2'], ['N4', 'C1'])
    (['N2', 'C2'], ['N5', 'C1'])
    (['N2', 'C2'], ['N7', 'C1'])
    (['N3', 'C1'], ['N6', 'C2'])
    (['N4', 'C1'], ['N6', 'C2'])
    (['N5', 'C1'], ['N6', 'C2'])
    (['N6', 'C2'], ['N7', 'C1'])
    

    您可以选择在它找到的前两个停止,或者找到它们然后从中随机抽样。或者随机打乱输入列表,然后停在前两个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2020-03-02
      • 1970-01-01
      • 2018-01-20
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多