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

2024-09-29 02:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想用逻辑OR的等价物将它们合并在一起,例如1------| --3-5--=1-3-5--。做这件事最像Python的方法是什么?我现在正在做这个,但感觉不是特别优雅:

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

请注意,我使用的是Python2.7,因此没有可变字符串,并且可以安全地假设输入字符串的格式总是正确的(=总是使用-表示false,1..7表示true)。你知道吗


Tags: or方法字符串inforlenifrange
3条回答

使用^{}generator expressionconditional expression

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

您可以使用内置的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'

您可以将其推广到一个可工作任意数周的函数,例如:

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--

相关问题 更多 >