【问题标题】:Align two lists and do action on aligned and miss-aligned objects对齐两个列表并对对齐和未对齐的对象执行操作
【发布时间】:2015-05-20 13:05:09
【问题描述】:

我试图找到一种方法来对齐两个对象列表(按其值排序)并通过比较它的值,如果对象在两个列表中对齐,则执行一个操作,否则执行另一个操作。例如,他的名字和年龄的孩子,并使用年龄值来对齐他们。

为了使示例简单,请尝试仅使用两个排序的整数值列表:

a = (1,2,3,6,7,11,13)
b = (2,3,4,6,7,9)

我想像这样对齐它们:

+----+----+----+----+----+----+----+----+----+
| 01 | 02 | 03 | xx | 06 | 07 | xx | 11 | 13 |
+----+         +----+         +----+----+----+
| xx | 02 | 03 | 04 | 06 | 07 | 09 | xx | xx |
+----+----+----+----+----+----+----+----+----+

对对齐值执行操作(例如将其附加到 list1):

list1 = [2,3,6,7]

并对未对齐的值执行操作(例如将其附加到 list2):

list2 = [1,4,9,11,13]

或者只是打印是否对齐:

1 = miss-aligned
2 = aligned
3 = aligned
4 = miss-aligned
6 = aligned
7 = aligned
9 = miss-aligned
11 = miss-aligned
13 = miss-aligned

我尝试过这种方式,但是......

a = (1,2,3,6,7,11,13)
b = (2,3,4,6,7,9)
list1 = []
list2 = []

# find sames and list a different value
for x in a:
    for y in b:
        if x == y:
            list1.append(x)
            print(x," = aligned")
            break
        if y == b[-1]:
            print(x," = miss-aligned")
            list2.append(x)

# find list b different value
for y in b:
    for x in a:
        if x == y:
            break
        if x == a[-1]:
            print(y," = miss-aligned")
            list2.append(y)

print('Same:',list1)
print('Different:',list2)

...我得到了这个不想要的输出(对于 4 和 9 没有按正确的顺序执行操作):

1  = miss-aligned
2  = aligned
3  = aligned
6  = aligned
7  = aligned
11  = miss-aligned
13  = miss-aligned
4  = miss-aligned
9  = miss-aligned
Same: [2, 3, 6, 7]
Different: [1, 11, 13, 4, 9]

我尝试了许多其他方法但没有成功。

*edit: 同一个列表中没有重复值

【问题讨论】:

  • 每个列表中可以有重复项吗?而且在你的情况下,只有6 是对齐的。您需要通过说 align 更好地定义您的意思,也许您的意思是 在两个列表中都存在
  • 同一列表中没有重复项。我发现定义“对齐”的更好方法是我在 ascii 中所做的小画
  • 酷,然后看看我的回答

标签: python algorithm list


【解决方案1】:

由于列表已排序,您可以执行以下操作:

def same_diff(a, b):
    sames = []
    diffs = []
    i = 0
    j = 0
    while i < len(a) and j < len(b):
        if a[i] == b[j]:
            sames.append(a[i])
            i += 1
            j += 1
        elif a[i] > b[j]:
            diffs.append(b[j])
            j += 1
        else:
            diffs.append(a[i])
            i += 1
    diffs += a[i:]
    diffs += b[j:]
    return sames, diffs

a = (1,2,3,6,7,11,13)
b = (2,3,4,6,7,9)

same_diff(a, b)
# ([2, 3, 6, 7], [1, 4, 9, 11, 13])

如果你对这些值做一些事情而不是附加剩余的值,你可以循环它们:

def same_diff(a, b):
    sames = []
    diffs = []
    i = 0
    j = 0
    while i < len(a) and j < len(b):
        if a[i] == b[j]:
            print 'aligned', a[i]
            sames.append(a[i])
            i += 1
            j += 1
        elif a[i] > b[j]:
            print 'miss-aligned', b[j]
            diffs.append(b[j])
            j += 1
        else:
            print 'miss-aligned', a[i]
            diffs.append(a[i])
            i += 1
    while i < len(a):
        print 'miss-aligned', a[i]
        diffs.append(a[i])
        i += 1
    while j < len(b):
        print 'miss-aligned', b[j]
        diffs.append(b[j])
        j += 1
    return sames, diffs

会导致:

same_diff(a, b)

miss-aligned 1
aligned 2
aligned 3
miss-aligned 4
aligned 6
aligned 7
miss-aligned 9
miss-aligned 11
miss-aligned 13
# ([2, 3, 6, 7], [1, 4, 9, 11, 13])

【讨论】:

  • 正是我正在寻找的!我已经尝试过像你这样的东西,但是我迷路了,而且对许多“如果条件”感到非常混乱,而且从来没有得到好的结果。我现在明白了,对我来说更清楚了(第二个代码是我想做的更多)。非常感谢!
【解决方案2】:

如果你想得到:

  • 两个列表中都存在的元素
  • 仅存在于其中一个列表中的元素

set 会派上用场:

a_set = set(a)
b_set = set(b)

same = sorted(a_set.intersection(b_set))
different = sorted(a_set.symmetric_difference(b_set))

print(same)
print(different)

...你会得到:

[2, 3, 6, 7]
[1, 4, 9, 11, 13]

如果不对齐发生在哪个列表中确实很重要,您可以做一个简单的减法:

mis_aligned_a = b - a  # [9, 4]
mis_aligned_b = a - b  # [1, 11, 13]

【讨论】:

  • 是的,但结果看起来像我所做的代码:对对齐值应用的操作顺序良好,但对未对齐值(最后是 4 和 9)没有。而且我不只是想列出相同和不同元素的两个列表,而是要在相同或不正确的情况下执行操作(例如我所做的“打印”)。
  • 排序呢?我错过了什么吗?
  • 更新了我的答案,看看有没有帮助
  • 它给出了很好的结果,但 Dting 找到了更适合我需求的解决方案。如果值对齐或不像我描述的那样,它允许插入代码。但非常感谢您帮助找到解决方案。真的很感激!
猜你喜欢
  • 2012-08-31
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多