以字符串格式从元组中删除项目

时间:2019-03-14 06:24:57

标签: python python-3.x formatting tuples string-formatting

这是我的琴弦

a = '(20.0, 8.0, 8.0, 37.0)'

并且我只希望前三个项目采用这种格式

str = 20.0x8.0x8.0 

并将最后一项存储在列表中。

leftover = [37.0]

之前我在字符串中只有3个维,因此我多次使用replace函数对其进行转换。

converted = str(''.join(str(v) for v in a)).replace("(","").replace(")","").replace(", ","x")

我知道这不是最pythonic的方法,但它可以解决问题。但是我不知道如何从str(tuple)中删除元素

3 个答案:

答案 0 :(得分:4)

使用ast.literal_eval

import ast

a = '(20.0, 8.0, 8.0, 37.0)'

a_tupl = ast.literal_eval(a)

string = 'x'.join(map(str, a_tupl[:3]))  # 20.0x8.0x8.0
leftover = [a_tupl[-1]]  # [37.0]


不要将变量命名为str,因为它会掩盖内置变量。

答案 1 :(得分:1)

尝试一下:

[HttpGet]
[Route("CreateCardGroup")]
public ActionResult CreateCardGroup()
{
    PopulateCreateCardGroupLookups();

    return View();
}



[HttpPost]
[Route("CreateCardGroup")]
public ActionResult CreateCardGroup(CardGroupCreateDto dto)
{
    if (!ModelState.IsValid)
    {
        PopulateCreateCardGroupLookups();
        return View(dto);
    }


    if(!UnitOfWork.DiscountPatternRepository
        .IsCardGroupDateInRange(dto.DiscountPatternId, 
         dto.ActiveFromDate, dto.ActiveToDate))
    {
        ModelState.AddModelError("ActiveFromDate", @"Error In Date.");
        PopulateCreateCardGroupLookups();
        return View(dto); <---Problem Here
    }

    var group = dto.LoadFrom();
    var insertedId = UnitOfWork.CardGroupRepository.Add(group);

    foreach (var rangeDto in group.CardGroupGiftSerialRanges)
    {
        for (var i = rangeDto.GiftCardSerialBegin; i <= 
                     rangeDto.GiftCardSerialEnd; i++)
        {
            var serial = 
            UnitOfWork.GiftCardSerialRepository.GetBySerial(i);
            if (serial != null)
            {
                serial.CardGroupGiftSerialRangeId = rangeDto.Id;
                serial.DiscountPatternId = group.DiscountPatternId;
                UnitOfWork.Complete();
            }

        }
    }

    return Redirect("/CardGroup");
}

private void PopulateCreateCardGroupLookups()
{
    var discounts = 
     UnitOfWork.DiscountPatternRepository.GetNotExpireDiscountPattern();
    var discountDtos = discounts?.Select(c => new SelectListItem
    {
        Text = c.PatternTitle,
        Value = c.Id.ToString()
    }).ToList();
    ViewData["DiscountPatterns"] = discountDtos;

    var serials = 
    UnitOfWork.ChargeCardSerialRepository.GetNotAssignedSerials();
    var serialDtos = serials?.Select(c => new SelectListItem
    {
        Text = c.SerialNumber.ToString(),
        Value = c.Id.ToString()
    }).ToList();
    ViewData["ChargeSerials"] = serialDtos;

    ViewData["CardSerialCount"] = 
    UnitOfWork.GiftCardSerialRepository.GetNotUsedGiftSerials();
}

输出

from ast import literal_eval
str1 = "x".join([str(k) for k in literal_eval(a)[:3]])
leftover = [literal_eval(a)[-1]]

不导入'20.0x8.0x8.0' [37.0]

ast

答案 2 :(得分:1)

您可以对拆分后的字符串使用简单的LC,以从元组的字符串表示形式中获取值列表。
没有库,只有一个简单的python oneliner ...:

a = '(20.0, 8.0, 8.0, 37.0)'

l = [float(v) for v in a[1:-1].split(',')]
# [20.0, 8.0, 8.0, 37.0]

然后轻松创建所需的两个结果:

str('x'.join([str(v) for v in l[:3]]))
# '20.0x8.0x8.0'

[l[-1]]
# [37.0]