【问题标题】:How to merge lists having all the columns similar如何合并所有列相似的列表
【发布时间】:2015-06-12 22:28:08
【问题描述】:

我在 python 中有这些列表

['2015-02-09', '11:55:55.712', '0.000', '17', '10.5.164.81', '10.0.87.161', 53, 7788, '0', '1', '0', '133', '1']
['2015-02-09', '13:53:55.626', '0.000', '17', '10.132.67.12', '10.0.87.161', 53, 59110, '0', '1', '0', '87', '1']
['2015-02-09', '19:29:41.850', '0.000', '17', '10.150.12.241', '10.1.1.58', 53, 54801, '0', '1', '0', '155', '1']
['2015-02-10', '00:03:22.957', '0.000', '17', '10.0.228.231', '10.0.87.161', 53, 56803, '0', '1', '0', '84', '1']
['2015-02-10', '00:19:55.404', '0.000', '17', '10.195.0.225', '10.0.87.161', 88, 4338, '0', '1', '0', '127', '1']
['2015-02-10', '00:03:22.957', '0.000', '17', '10.0.228.231', '10.0.87.161', 53, 56803, '0', '1', '0', '84', '1']

如果 4th 5th 6th (从 0 开始)列相同,我必须合并列表。

也就是说,如果两行具有相同的'10.0.228.231', '10.0.87.161', 53,,我必须在添加其他列时将其放入一个条目中。

最好用python还是用sql做。我该如何接近?

【问题讨论】:

  • 你输入的是列表列表吗?
  • 如果两行的这些值相同,您想使用其他哪些值?还是它们都一样?
  • “同时添加其他列。” 显示与您的示例输入相对应的所需输出。
  • 是的!我的输入是一个列表列表。
  • @user1723766:你能在添加两个列表后给出最终单个条目的示例输出吗?匹配也可能找到两个以上的列表,那么在这种情况下会输出什么?

标签: python mysql list merge


【解决方案1】:

如果您不关心保留哪些行,并且想防止将来重复,您可以在三列上添加唯一索引,并自动删除冲突的行:

ALTER IGNORE TABLE <table> ADD UNIQUE KEY uidx_1(field_4, field_5, field_6)

编辑

好的,显然你不想改变表格,看起来你只是想改变输出。由于您似乎并不关心保留了哪些其他值(无论如何,在您的示例数据中,它们似乎都是相同的),您可以摆脱以下情况:

select *
  from <table>
  group by field4, field_5, field_6;

您可以通过在 select 子句中指定所需的确切字段来选择要包含的结果(即删除日期)。

请注意,由于 group by 的工作方式,您无法保证结果中会出现哪一行,只能保证其中只有 ONE 行。如果没有关于如何从哪一行中选择哪些字段在“合并”中幸存下来的任何进一步标准,这可能是您最好的选择

【讨论】:

  • 我不想忽略重复的字段,而是想为唯一字段添加 field_7、field_8、field_9、field_3、field_2(field_4、field_5、field_6)
  • 如果有三个重复行怎么办?
  • 如果有重复的行(两个或更多)。忽略日期列(删除它)合并重复的行并考虑到唯一性将其合并为一行(field_4,field_5,field_6)
  • 所以您只希望在访问数据时发生这种情况,您不希望它是对数据的永久更改吗?
  • 您必须指定“合并”的含义。你能告诉我们两个重复的行吗?你希望得到的行是什么样子的?
【解决方案2】:

一个简单的解决方案可能是使用字典,使用列 4,5 和 6 作为组合键。 显然,正确“求和”这些值仍然取决于您(请参阅下面的内联评论)。最好将列字符串转换为特定类型以允许运算符重载。

ilist = [
         ['2015-02-09', '11:55:55.712', '0.000', '17', '10.5.164.81', '10.0.87.161', 53, 7788, '0', '1', '0', '133', '1'],
         ['2015-02-09', '13:53:55.626', '0.000', '17', '10.132.67.12', '10.0.87.161', 53, 59110, '0', '1', '0', '87', '1'],
         ['2015-02-09', '19:29:41.850', '0.000', '17', '10.150.12.241', '10.1.1.58', 53, 54801, '0', '1', '0', '155', '1'],
         ['2015-02-10', '00:03:22.957', '0.000', '17', '10.0.228.231', '10.0.87.161', 53, 56803, '0', '1', '0', '84', '1'],
         ['2015-02-10', '00:19:55.404', '0.000', '17', '10.195.0.225', '10.0.87.161', 88, 4338, '0', '1', '0', '127', '1'],
         ['2015-02-10', '00:03:22.957', '0.000', '17', '10.0.228.231', '10.0.87.161', 53, 56803, '0', '1', '0', '84', '1']
        ]

def f(rowa, rowb):
    merged = []
    idx = 0
    for ela, elb in zip(rowa, rowb):
        if idx >= 4 and idx <= 6:
            newel = ela
        else:
            newel = ela + elb  # I leave the meaning of '+' up to you
        merged.append(newel)       
    return merged

outd = {}
for row in ilist:
    key = (row[4], row[5], row[6])
    storedrow = outd.get(key, None)
    if storedrow is not None:
        outd[key] = f(storedrow, row)
    else:
        outd[key] = row
for k, v in outd.items():
    print k, v

【讨论】:

  • 这会合并三四个重复吗?
  • 是的,当然。任意数量的重复。如果键在字典中(即已遇到该行),则合并值。
猜你喜欢
  • 1970-01-01
  • 2018-02-24
  • 2011-07-19
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多