Python str to кортеж

Как создать кортеж из строки и списка строк

https://youtu.be/zc5eua09cqg кортежи, строки и списки, прежде чем мы посмотрим на создание кортежей, в качестве отправной точки, было бы полезно уточнить значение различных терминов, которые мы будем использовать на протяжении всей этой статьи: строка Последовательность символов и представляет собой один из основных типов данных Python Data.a, который используется для хранения … Как создать кортеж из строки и списка строк Подробнее »

Кортежи, строки и списки

Прежде чем мы посмотрим на создание кортежей, в качестве отправной точки, было бы полезно прояснить значение различных терминов, которые мы будем использовать на протяжении всей этой статьи:

  • А строка Это последовательность символов и представляет собой один из основных типов данных Python.
  • А Список Используется для хранения нескольких элементов в одной переменной, список позволяет дублировать значения, заказывается и является смешной. Список элементов могут быть разными типами данных.
  • А кортеж Также используется для хранения нескольких элементов в отдельной переменной, кортеж позволяет упорядочить дублирующие значения, и неизменяется. Предметы кортежей могут быть разными типами данных.

Как вы можете видеть, в большинстве уважение, кортежи и списки идентичны, но они отличаются двумя ключевыми свойствами:

  • Кортеры определяются, охватывающие элементы в скобках () , тогда как списки используют квадратные скобки []
  • Кортежи неизменяются, что однажды создаваемые они могут не быть изменен. Списки, с другой стороны, смены, что означает они может быть измененным после создания.
Читайте также:  What are HTML imports and how do they work

Функция Tupple ()

Итак, теперь мы уточнили терминологию, мы можем посмотреть на создание кортежей, и к счастью для нас Python имеет Встроенная функция Для этой цели: кортеж () Отказ

Есть два способа, чтобы мы могли использовать эту функцию, поэтому давайте начнем с создания простой строки и списка строк:

my_string = 'Hello' my_list = ('today', 'is', 'Wednesday')

И мы можем подтвердить, что они действительно правильный тип следующим образом:

print(type(my_string)) # print(type(my_list)) # 

Конверсия списка

По умолчанию кортеж () Функция превращает объект списка в кортеж, поэтому сделать эту работу для нашего примера, нам нужно:

  1. Преобразовать наш строковый объект в список, включив его в квадратные скобки []
  2. Добавить Этот новый объект списка к нашему существующему списку (my_list) с ‘ + «
  3. Преобразуйте результирующий список в кортеж, передавая его в кортеж () функция
res = tuple([my_string] + my_list) print(res) # ('Hello', 'today', 'is', 'Wednesday')

И просто чтобы подтвердить, что мы действительно имеем кортеж:

Преобразование кортежей

В качестве альтернативы мы можем преобразовать как нашу строку, так и список непосредственно в кортеж следующим образом:

>>> res1 = (my_string,) + tuple(my_list) >>> res1 ('Hello', 'today', 'is', 'Wednesday')

И просто чтобы подтвердить, что мы действительно имеем кортеж:

Как вы, возможно, заметили, с этим методом мы не преобразовали нашу строку в объект списка, и мы явно не визием его кортеж, передавая его через кортеж () функция. Кроме того, вы, вероятно, заметили запятую «,» после my_string Переменная. Это не опечатка! Это все из-за того, как Python рассматривает отдельные вещи в кортеже.

Создание кортежа из одного предмета

Чтобы понять это, давайте посмотрим, что произойдет, если бы мы прошли один элемент строки, в нашем случае my_string Переменная, через нашу функцию кортежей без запятой:

>>> single = tuple(my_string) >>> single ('H', 'e', 'l', 'l', 'o')

Как видите, Python предположил, что каждый символ строки представляет собой отдельный элемент. Чтобы наше my_string Переменная рассматривается как один элемент, нам нужно добавить запятую:

>>> single = tuple(my_string,) >>> single ('H', 'e', 'l', 'l', 'o')

Хорошо, так что это не был результатом, который мы тоже ожидали! Опять же, это до того, как Python создает кортежи с одним предметами – независимо от того, является ли это строкой, целым числом или плавать Отказ Просто добавив запятую после нашего товара, Python знает, что это кортеж. Явно проехав через кортеж () Функция, Python предполагает каждый персонаж следует рассматривать как отдельный элемент. Поэтому, если у нас есть единый товар, и мы хотим создать кортеж, мы просто должны поставить запятую после него, нам даже не нужны скобки:

>>> single = my_string, >> single ('Hello',)

И мы можем подтвердить, что этот предмет действительно кортеж:

Использование скобок ()

Это привело нас к последнему тему в этой статье, использование скобок для создания кортежа. Как мы видели при создании кортежа из одного предмета, скобки очень намного необязательно. Python создаст кортеж чисто на основе использования запятой после нашего предмета:

Точно так же мы можем напрямую создать кортеж, используя запятую для разделения нескольких элементов:

my_tuple = 'Hello', 'today', 'is', 'Wednesday' print(my_tuple) # ('Hello', 'today', 'is', 'Wednesday') print(type(my_tuple)) # tuple

Поэтому запятая, которая создает кортеж в Python, а не в скобках.

Резюме

Как мы сосредоточились только на создании кортежа из строки и списка строк, кортеж () Функция оказалась идеальной. Это логично и просто, и разница между Список преобразования и Конверсия кортежа Методы минимальны. Хотя, если это скорость, у вас после того, как метод преобразования кортежа, очевидно, быстрее.

Если вы хотите создать кортеж из одного элемента, будь то строка, целое число или поплавок, мы видели, что запятая то, что на самом деле говорит Python, мы хотим создать кортеж. На самом деле, мы видели, что мы можем использовать запятую на одном и нескольких предметах, чтобы создать кортеж, даже без скобок.

Хотя использование скобок в этих экземплярах действительно необязательно, это хорошо, чтобы они в любом случае их включают – чтобы кто-нибудь читал ваш код, знает, что вы явно хотели создать кортеж и избежать какой-либо двусмысленности.

Читайте ещё по теме:

Источник

converting string to tuple

I need to write a function that takes a string ‘(1,2,3,4,5),(5,4,3,2,1)’ and returns a list of tuples of the 1st and last element of each tuple, [(1,5),(5,1)]. I was thinking:

def f(givenstring): a=givenstring.split(',') for i in a[0:-1]: tuple(int(i[0,-1])) 

Think more like re.findall() or eval() (but remember, eval is evil). Sorry, no time for a full answer.

3 Answers 3

Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

from ast import literal_eval s = '(1,2,3,4,5),(5,4,3,2,1)' l = literal_eval(s) print l # ((1, 2, 3, 4, 5), (5, 4, 3, 2, 1)) print [(x[0], x[-1]) for x in l] # [(1, 5), (5, 1)] 

You may use eval . I think it’ll be the shortest one.

>>> s = '(1,2,3,4,5),(5,4,3,2,1)' >>> ts = eval(s) >>> ts ((1, 2, 3, 4, 5), (5, 4, 3, 2, 1)) >>> tsp = [(el[0],el[-1]) for el in ts] >>> tsp [(1, 5), (5, 1)] 

Still, it’s not a good practice to use eval .

Another option is to parse the string using re module.

>>> a = re.findall('\([^)]*\)',s) >>> a ['(1,2,3,4,5)', '(5,4,3,2,1)'] 

Regexp pattern means this:

\( #opening parenthesis [^)]* #from 0 to infinite symbols different from ) \) #closing parenthesis 
>>> b = [el.strip('()') for el in a] >>> b ['1,2,3,4,5', '5,4,3,2,1'] >>> c = [el.split(',') for el in b] >>> c [['1', '2', '3', '4', '5'], ['5', '4', '3', '2', '1']] >>> d = [tuple(int(el2) for el2 in el) for el in c] >>> d [(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)] 

Also, you may do the following:

>>> [tuple(int(i) for i in el.strip('()').split(',')) for el in s.split('),(')] [(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)] 

This approach takes not modules at all. But it’s not very robust (if the input string will have some inconsistency, e.g. space between parentheses and comma . ), (. , then noting will work).

Источник

Parse a tuple from a string? [duplicate]

Say I have a string that’s of the same form a tuple should be, for example, «(1,2,3,4,5)» . What’s the easiest way to convert that into an actual tuple? An example of what I want to do is:

tup_string = "(1,2,3,4,5)" tup = make_tuple(tup_string) 

Just running tuple() on the string make the whole thing one big tuple, whereas what I’d like to do is comprehend the string as a tuple. I know I can use a regex for this, but I was hoping there’s a less costly way. Ideas?

5 Answers 5

>>> from ast import literal_eval as make_tuple >>> make_tuple("(1,2,3,4,5)") (1, 2, 3, 4, 5) 

Be aware of the corner-case, though:

>>> make_tuple("(1)") 1 >>> make_tuple("(1,)") (1,) 

If your input format works different than Python here, you need to handle that case separately or use another method like tuple(int(x) for x in tup_string[1:-1].split(‘,’)) .

It’s surprising how many questions on SO can be answered with ast.literal_eval, itertools.product, and only a handful of library functions..

in my case I could handle the corner-case for strings with: not isinstance(make_tuple(«(‘any-string’)»), basestring) and pad make_tuple’s output with the extra comma when required.

I would recommend using literal_eval .

If you are not comfortable with literal_eval or want to have more control on what gets converted you can also disassemble the string, convert the values and recreate the tuple.

Sounds more complicated than it is, really, it’s a one-liner:

eg = '(102,117,108)' eg_tuple = map(int, eg.replace('(','').replace(')','').split(','))) 

This would throw a ValueError if any element (string) in the tuple is not convertible to int , like, for example the ‘1.2’ in the string: ‘(1.2, 3, 4)’ .

The same can be achieved with regex:

import re eg = '(102,117,108)' et_tuple = tuple(map(int, re.findall(r'6+', eg))) 

Since you know the parenthesis will be at both ends of the string, using strip() instead of replace(). Then it becomes eg_tuple = eg.strip(‘()’).split(‘,’)

You can parse your string without SyntaxError

def parse_tuple(string): try: s = eval(string) if type(s) == tuple: return s return except: return 

This function return the Tuple if parse is success. Otherwise return None .

Simplest way to do this (without ast):

def _make_tuple(self, val: str) -> tuple: """ Convert a string representation of a tuple to a tuple. Example: "('item1', 'item2')" -> ('item1', 'item2') """ return tuple(v.lstrip("('").rstrip("')") for v in val.split(", ")) 

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

This will only work in very limited cases. Tuples can contain more than just strings; a tuple of strings can represent the strings with double-quotes rather than single-quotes depending on the string contents; and escape sequences will also cause a problem.

We can also parse it by ourself. Let’s say we have tuple returned by Python like below:

((2, 'C/C++', 0, 'clang_cpp'), (3, 'Python相关', 0, 'python')) 

First, we keep reading the characters in the tuple string but stores the last left semicolon’s position and how many semicolons we have meet (we can call it left semicolon level, as so for right semicolons), whenever we meet a right semicolon, we do things below:

  1. Take a substring from last semicolon to current right semicolon.(In this substring, there is no more semicolons, we just split it into array by «,». Let’s say the new array is M )
  2. Then we append M to our result array, which array will stores all M .
  3. Thirdly, delete the substring we taken from the original string. Finally, do the same things like step 1 till the right and left semicolon’s level comes to 0.

JavaScript code is like below:

function parseTuple(t)< var lc = "("; var rc = ")"; var lc_level = 0; var rc_level = 0; var last_lc = 0; var last_rc = 0; var result = []; for(i=0;ielse if(t[i] == rc) < rc_level++; last_rc = i; >if(rc_level == 1) < var substr = t.slice(last_lc+1,last_rc); var data = substr.split(","); result.push(data); lc_level--; rc_level--; i = 0; t = t.slice(0,last_lc) + t.substring(last_rc+1); >if(lc_level == rc_level && lc_level==0) < break; >> return result; >

Источник

Оцените статью