1

问题:

  • 尝试评估列表中每个项目的前 4 个字符。
  • 如果前 4 个字符与列表中的另一个前 4 个字符匹配,则将最后三个数字附加到前四个数字。请参见下面的示例。

笔记:

  • 列表值不是硬编码的。
  • 该列表始​​终具有这种结构“####.###”。
  • 只需要匹配每个列表项中的前 4 个字符。
  • 顺序不是必需的。

代码:

Grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102", "094G.032"]

期望的输出:

Grid = ["094G.016\019\032", "194P.005\015", "093T.021\102"]

研究:

  • 我知道集合可以找到重复项,我可以使用集合仅评估第一个 4 个字符吗,由于无法对集合进行索引,我会遇到问题吗?

  • 将列表项分成两部分会更好吗?句点前的四位数字(“094G”)和句点后的三位数字(“093”)的单独列表,比较它们,然后将它们加入一个新列表?

  • 有没有更好的方法来一起做这一切,我没有意识到?

4

4 回答 4

3

这是一种直接的方法。

from collections import defaultdict

grid = ['094G.016', '094G.019', '194P.005', '194P.015', '093T.021', '093T.102', '094G.032']
d = defaultdict(list)

for item in grid:
    k,v = item.split('.')
    d[k].append(v)

result = ['%s.%s' % (k, '/'.join(v)) for k, v in d.items()]

给出无序result

['093T.021/102', '194P.005/015', '094G.016/019/032']
于 2012-07-06T15:43:28.950 回答
0

您最可能需要的是将每个代码的第一部分映射到第二部分列表的字典。您可以像这样构建字典:

mappings = {}    #Empty dictionary
for code in Grid:  #Loop over each code
    first, second = code.split('.')   #Separate the code into first.second
    if first in mappings:     #if the first was already found
        mappings[first].append(second)  #add the second to those already computed
    else:
        mappings[first] = [second]   #otherwise, put it in a new list

一旦你有了字典,循环它并将第二部分组合在一起将非常简单(理想情况下,使用'\\'.join

于 2012-07-06T15:44:40.300 回答
0

听起来像是一份工作defaultdict

from containers import defaultdict

grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102"]
d = defaultdict(set)

for item in grid:
    prefix, suffix = item.split(".")
    d[prefix].add(suffix)

output = [ "%s.%s" % (prefix, "/".join(d[prefix]), ) for prefix in d ]
于 2012-07-06T15:46:22.950 回答
0
>>> from itertools import groupby
>>> Grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102", "094G.032"]
>>> Grid = sorted(Grid, key=lambda x:x.split(".")[0])
>>> gen = ((k, g) for k, g in groupby(Grid, key=lambda x:x.split(".")[0]))
>>> gen = ((k,[x.split(".") for x in g]) for k, g in gen)
>>> gen = list((k + '.' + '/'.join(x[1] for x in g) for k, g in gen))
>>> for x in gen:
...     print(x)
...
093T.021/102
094G.016/019/032
194P.005/015
于 2012-07-06T16:04:35.803 回答