【问题标题】:comparison between two lists. Is it possible to get an output as listed? [closed]两个列表之间的比较。是否可以获得列出的输出? [关闭]
【发布时间】:2014-02-25 14:02:41
【问题描述】:

我在两个文件中有两个列表(输入)Alpha 和 Beta。 [值是制表符分隔的。现在我用 = 符号] 分隔它。

Alpha:
x=1
y=2
z=3 

Beta:
y=2
a=1
x=1
z=4

我想得到这样的输出:
Alpha vs Beta
| -- || a=1 |
| z=3 | z=4 |

已编辑:程序将检查第一个数据 (x) 是否存在于两者中。如果不存在,它将在输出中列出。如果存在,它将检查值是否相同。如果值不同,它将在输出中列出。
IE;
它将在两种情况下打印输出。
1. 如果一个键(x 或 y 或任何一个键)在 Alpha 和 Beta 中都不存在。
2.如果在Alpha或Beta中key的值不匹配

我已经尝试过使用 shell 脚本.. 但无法完全实现!
所以如果是shell/python对我来说会更好。

但我欢迎任何语言:)

【问题讨论】:

  • 你能解释一下输出是如何从输入列表中得到的吗
  • 好的。我将编辑问题。
  • 这些是从一个看起来像这样的文件输入的吗?
  • 是的。输入来自文件。
  • alpha 和 beta 列表中是否会出现重复项,例如两个 y 值?

标签: java jquery python shell comparison


【解决方案1】:

你说这些值是制表符分隔的,所以我让脚本解决了这个问题。如果它们是= 分隔的,则必须更改拆分。我还跳过了任何不会在标签上拆分的行 try except 块。它可能不是最有效的代码,但它可以完成工作。

with open('input.txt') as f:
    isBeta = False
    beta = {}
    alpha = {}
    for line in f:
        if line.strip() == 'Beta:':
            isBeta = True
            continue
        elif line.strip() == 'Alpha:' or not line.strip():
            continue


        try:
            k,v = line.split()
        except:
            continue
        if isBeta:
            beta[k] = v
        else:
            alpha[k] =  v

    for k in sorted(set(alpha.keys()+beta.keys())):
        if k not in alpha:
            print '| -- | ' + k + '=' + beta[k] + '|'
        elif k not in beta:
            print '|' + k + '=' + alpha[k] + ' | -- |'
        elif alpha[k] == beta[k]:
            continue
        else:
            print '|' + k + '=' + alpha[k] + ' | ' + k + '=' + beta[k] + '|'

【讨论】:

  • 我也使用了一个 shell 脚本。感谢您的回答。帮了我很多!
【解决方案2】:

将列表转换为地图

Map<String,String> listToMap(List<String> list){

   Map<String,String> map = new HashMap<>();

   for (String str : list) {
    String[] array= str.split(`=`);
    if (array.length != 2) continue; //ignore invalid line
    map.put(array[0],array[1]);

   }
  return map;
  }

然后您将列表转换为地图

Map<String,String> mapA = listToMap(Alpha);
Map<String,String> mapB = listToMap(Beta);

创建连接的密钥集,

Set<String> keyset = new HashSet<>();
keyset.addAll(mapA.keySet());
keyset.addAll(mapB.keySet());

然后你剩下的就是比较你的列表/地图

for (String key : keyset)
{
String valueA = mapA.get(key);
System.out.print(valueA ==null?"---":valueA);
System.out.print(" | ");
String valueB = mapB.get(key);
System.out.print(valueB ==null?"---":valueBA);
System.out.print("\n");
}

【讨论】:

  • 忘记了这也对Java 开放。有一段时间没看到了。 OOP 到了极致。 System.out.print :-)
  • 没关系 Hoopdady。你的剧本很棒。我正在尝试使用真实数据。我认为它打破了它!
  • @smilyface 它破坏了我的脚本吗?
猜你喜欢
  • 1970-01-01
  • 2022-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多