将两个“位图”的内容合并(逻辑或)。在字符串中

时间:2014-10-01 13:21:13

标签: python string bitmap logical-operators

我有两个包含'位图的字符串'工作日:例如,1------仅在星期一,--3-5--是星期三和星期五,你明白了。

我希望将它们与逻辑OR的等价物合并在一起,以便例如。 1------ || --3-5-- = 1-3-5--。最恐怖的方式是什么?我目前正在做这件事,但感觉不是特别优雅:

week1, week2, merged = '1------', '--3-5--', ''
for i in range(0, len(week1)):
  merged += week1[i] if week1[i] != '-' else week2[i]
print merged

请注意,我使用的是Python 2.7,因此没有可变字符串,并且可以安全地假设输入字符串始终格式正确(=始终使用-表示false和{{ 1}}在正确的位置为真)。

4 个答案:

答案 0 :(得分:5)

使用zipgenerator expressionconditional expression

>>> ''.join(b if a == '-' else a for a, b in zip('1------', '--3-5--'))
'1-3-5--'

答案 1 :(得分:3)

您可以使用内置mapmaxzip

>>> week1, week2 = '1------', '--3-5--'
>>> ''.join(map(max, zip(week1, week2)))
'1-3-5--'

这是因为:

  • zip返回每个字符串中第n个字符的元组[('1', '-'), ('-'. '-'), ... ]

  • 当且仅当所有条目都为max时,
  • -才会从元组返回-。这是因为-的排序低于数字字符,例如max('1', '-') == '1'

  • mapmax应用于压缩列表中的每个元组,生成最大字符列表。

  • ''.join使用空字符串将使用map生成的最大字符列表链接在一起。

如果您有超过两周的字符串,则此表达式也有效:

>>> week3 = '------7'
>>> ''.join(map(max, zip(week1, week2, week3)))
'1-3-5-7'

答案 2 :(得分:3)

您可以将其概括为适用于任意数量的的函数,例如:

week1, week2, week3 = '1------', '--3-5--', '---4--6-'

def bitor_weeks(*args):
    days = set().union(*args).difference('-')
    return ''.join(ch if ch in days else '-' for ch in '1234567')

print bitor_weeks(week1, week2, week3)

或者选择整个hog并在其上启用所有按位操作,例如:

class WeekSet(set):
    def __init__(self, *args):
        days = set().union(*args).difference('-')
        if days.difference('1234567-'):
            raise ValueError('inputs must be 1-7 or -')
        set.__init__(self, days)
    def __repr__(self):
        return ''.join(ch if ch in self else '-' for ch in '1234567')


week1, week2, week3 = '1------', '--3-5--', '-2-4--7'
t1 = WeekSet(week1, week2)
# 1-3-5--
print WeekSet('456') & t1
# ----5--

答案 3 :(得分:0)

这有点重,但你可能有超过2个“周”字符串

''.join(filter(lambda l: l!='-', lst)[0] if set(lst) != set(['-']) else '-' 
        for lst in zip(week1, week2))