【问题标题】:working inside the boundaries denoted by 'None' inside a list在列表内由“无”表示的边界内工作
【发布时间】:2011-10-25 10:59:43
【问题描述】:

我有一个输入列表,例如:

mylist = [('a', [(2, 4), (0, 5)]), ('b', [(3, 9), (1, 1)]), ("'", None), ('c', [(1,7), (2, 8)])] 

我必须对列表中的值进行比较。 (2,4) 之类的项目表示范围。列表中的“无”条目就像一个边界。比较发生在边界内。所以在这里,将首先在 a 和 b 之间进行比较。比较基本上是在不同条件下给出的值之间进行比较,例如它们是否重叠,因为它们是范围。因此,在与邻居的范围比较后,范围会发生变化。

if within the boundary : (something like "if ! None : then continue")
    do the comparisons between the items inside the boundary 
if None :
    move to next boundary
    do the comparisons between the items inside the next boundary   

比较是使用简单的规则,例如比较 (2,4) 和 (3,9),然后这两个部分重叠,因此选择它们之间的共同点。因此,结果是 (3,4)。

我已经编写了所有比较规则的代码,但我没有限制地尝试它们。但它们应该在界限内。而且我无法用代码表达边界。谢谢。

【问题讨论】:

  • 你想得到什么结果?
  • 结果将与输入列表的类型相同,除了在比较内部值时值的变化。它们实际上代表范围。假设当我们比较 a 和 b 时,(2, 4) 将与 (3, 9) 进行比较,a 的结果取决于给定的规则或条件。所以a的值将替换为'a',[(2,3),(0,1)]。谢谢。
  • 投反对票,因为它非常不清楚。澄清问题,以便我们了解您要做什么,我将修改否决票。

标签: python


【解决方案1】:

您可以通过使用itertools.groupby 测试它们的第二个值是否为None 来对项目进行分组。

>>> import itertools
>>> mylist
[('a', [(2, 4), (0, 5)]), ('b', [(3, 9), (1, 1)]), ("'", None), ('c', [(1, 7), (2, 8)])]
>>> grp = itertools.groupby(mylist, lambda i: i[1] is None)
>>> res = [tuple(i[1]) for i in grp if not i[0]] #use parantheses for faster generator expression.
>>> pprint.pprint(res)
[(('a', [(2, 4), (0, 5)]), ('b', [(3, 9), (1, 1)])),
 (('c', [(1, 7), (2, 8)]),)]

现在您可以使用简单的 for 循环进行比较:

for item in res:
    #do comparisons

【讨论】:

  • 非常感谢。 itertools 是否也适用于这些文件。如果我给一个文件来对项目进行分组,那么它会起作用吗?
  • @cvani,文件对象是可迭代的,所以 itertools 也可以。
【解决方案2】:

基于您其他问题的代码,如果您想分别处理res 的每个部分并累积结果,您可以这样做(使用@utdemir 答案中的方法):

from operator import itemgetter
print "Original List"
print '\n'.join(str(l) for l in phonemelist)
grp = itertools.groupby(phonemelist, itemgetter(1))
res = [tuple(v) for k, v in grp if k]
print '\n'.join(str(l) for l in res)
newlists = []
# for each part between the markers
for item in res:
    # update the ranges and add it to the overall list
    newlists.append(update_ranges(item))
print "\n after applying co-articulation rules"
print '\n\n'.join('\n'.join(str(i) for i in l) for l in newlists)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2010-10-23
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多