jak dodać wartość do krotki?


80

Pracuję nad skryptem, w którym mam listę takich krotek ('1','2','3','4'). na przykład:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Teraz trzeba dodać '1234', '2345', '3456'i '4567'odpowiednio na końcu każdej krotki. na przykład:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

Czy jest to w jakikolwiek sposób możliwe?


8
rozwiązanie wielojęzyczne? ;)
Snowbear

2
Witamy w StackOverflow! Po prawej stronie, gdy zadawałeś swoje pytanie, było to przydatne pudełko Jak sformatować . Warto przeczytać, podobnie jak strona, do której prowadzi link z [?] Tuż nad obszarem pytań.
TJ Crowder,

3
Przynajmniej w Pythonie krotki są niezmienne. Jeśli chcesz „dodać coś do krotki”, dlaczego nie użyć zmiennej struktury danych od samego początku?
Felix Kling

2
Ja też to robię - najczęściej z „plikiem”, ponieważ „dla pliku w plikach” jest cholernie naturalne! - ale generalnie powinieneś raczej unikać nazywania swoich list „listą”, która zastępuje wbudowaną „listę”.
DSM

Odpowiedzi:


138

Krotki są niezmienne i nie powinny być zmieniane - do tego służy typ listy. Możesz zastąpić każdą krotkę przez originalTuple + (newElement,), tworząc w ten sposób nową krotkę. Na przykład:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Ale raczej sugerowałbym używanie list od początku, ponieważ są one szybsze do wstawiania elementów.

I jeszcze jedna wskazówka: nie nadpisuj wbudowanej nazwy listw swoim programie, raczej wywołaj zmienną llub jakąś inną nazwę. Jeśli nadpiszesz wbudowaną nazwę, nie możesz jej już używać w bieżącym zakresie.


23
Skrótt += 1,

1
Doskonałe punkty, jednak jestem w niefortunnej sytuacji, w której chcę iteracyjnie dodawać wartości do sqlite3bazy danych i muszę utworzyć krotkę wartości do dodania (ponieważ wymagana składnia to VALUES (v1, v2, v3, ...). W tym przypadku wiedza, jak dodawać wartości do krotka jest bardzo korzystna
mgławica HS

16

Na podstawie składni domyślam się, że to Python. Celem krotki jest to, że jest ona niezmienna, więc musisz zastąpić każdy element nową krotką:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]

5
To oczywiście działa. Ale czy naprawdę należy to zrobić? Zastanawiam się. Ponieważ to niweczy cel posiadania krotki na pierwszym miejscu. A może się mylę?
user225312

9

W Pythonie nie możesz. Krotki są niezmienne.

Na liście zawierającej możesz jednak zastąpić krotkę ('1', '2', '3', '4')inną ('1', '2', '3', '4', '1234')krotką.


9

Jak wspomniano w innych odpowiedziach, po utworzeniu krotki są niezmienne, a lista może lepiej służyć Twoim celom.

To powiedziawszy, inną opcją tworzenia nowej krotki z dodatkowymi elementami jest użycie operatora splat:

new_tuple = (*old_tuple, 'new', 'items')

Podoba mi się ta składnia, ponieważ wygląda jak nowa krotka, więc jasno komunikuje, co próbujesz zrobić.

Korzystając ze splat, potencjalnym rozwiązaniem jest:

list = [(*i, ''.join(i)) for i in list]


7

Jak odpowiedzieli inni ludzie, krotki w Pythonie są niezmienne, a jedynym sposobem na ich „zmodyfikowanie” jest utworzenie nowej z dołączonymi elementami.

Ale najlepszym rozwiązaniem jest lista. Gdy trzeba wywołać jakąkolwiek funkcję lub metodę, która wymaga krotki, utwórz krotkę, używając krotki (listy).


4

Omówiłem kilka szczegółów związanych z tuplei listi zrozumiałem, że:

  • Krotki są Heterogeneoustypem danych kolekcji
  • Krotka ma stałą długość (na typ krotki)
  • Krotki są zawsze skończone

Aby dołączyć nowy element do krotki, należy go rzucić na niego listi wykonać append()na nim operacje, a następnie ponownie przesłać go z powrotem do krotki.

Ale osobiście, co czułem o pytanie, czy Krotki mają być skończone , stała długość przedmiotów, a jeśli używamy tych typów danych w naszych logiki aplikacji to nie powinno nie być scenariusz na dołączanie nowych elementów lub aktualizując wartość pozycji w to. Więc zamiast listy krotek powinna to być sama lista. Czy mam rację?


1
Istnieją scenariusze, w których musisz przekazać krotkę do funkcji, na przykład za pomocą SQL (psycopg2) lub interakcji z R (rpy2). Funkcje nie zawsze działają poprawnie, jeśli otrzymają listę zamiast krotki. Czasami otrzymujesz także krotkę z funkcji, a nie z listy. Krotki mogą chronić przed omyłkową modyfikacją oryginalnej listy, gdy zamiast tego powinieneś pracować nad kopią listy. Zatem tak, listy pośrednio lub bezpośrednio są pośrednikami w przedstawionych odpowiedziach. Jednak rzutowanie z powrotem do krotki na końcu jest nadal logiczne w wielu scenariuszach.
Nate Wanner

2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)

0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

WYDAJNOŚĆ jest tym, czego pragniesz

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.